CTF-Pwn学习记录:7月挑战回顾

07.19

CTF特训营---REVERSE阅读
P208——P

1、X86指令体系

  • 寄存器组
  • 汇编指令集:Intel , AT&T
    Intel的几种指令

2、X64指令体系

3、反汇编与反编译工具:IDA、HEX-RAY
以Jarvis OJ-Reverse-软件密码破解2为例

07.20 H4师傅书籍阅读记录

1、环境搭建

  • 查看相关版本配置


    4613D427-6DF1-41E8-8CD4-090E89854338.png

内核版本
4.15.0-72-generic
python2.7

  • gdb安装
    下载wget http://ftp.gnu.org/gnu/gdb/gdb-7.10.1.tar.gz
    解压 tar -zxf gdb-7.10.1.tar.gz
    补充:-c create/ -v 显示执行过程 /-f file / -x extract / -z gzip压缩或ungzip解压
    ./configure ---> make --->
    make的时候报错了。直接尝试apt -install gdb ,成功

    07F627FC-9EC2-4258-9FD5-A0D85A8A78E6.png

  • gdb插件Pwndbg和peda
    peda:
    git clone https://github.com/longld/peda.git ~/peda
    echo "source ~/peda/peda.py" >> ~/.gdbinit
    安装到了root目录下
    Pwndbg

两个插件交替使用:
source ~/peda/peda.py
source 目录 gdbinit.py
/root/pwn/software/pwndbg/pwndbg

  • pwntools
    使用的是python2
pip install pwn
from pwn import *

使用:
p32(),打包为32位, u32()转换为十进制
python中,ord('a') = 97 chr(0x66) = f

  • ROPgadget
    在程序中寻找 ROP chain 的一个辅助小工具

    EE4FB9A9-8BA6-4357-B3E9-8753868D791F.png

  • one_gadget


    EF1D0B3E-90A4-444F-8A11-07D832D25328.png
  • seccomp-tools


    5433A27C-865E-4FC3-9C52-FEF9D4753761.png
  • Libc 数据库查询

2、题目aaaaa

file查看程序信息
响应版本ida打开--->main--->F5
数字点住,按h,可以10进制与16进制转换
观察程序逻辑,看如何能getshell

  • 步骤,编写exp,如下
from pwn import *
r = process("./aaaaaaaaaa")
r.send("a"*200)             # 数量大于 99 即可
r.interactive()
  • 报错


    DBE47D89-F958-46E1-BE7B-FCABD2E9866B.png

权限不够,没有可执行权限
添加 chmod a+x aaaaaaaa

执行/bin/sh相当于开了一个shell窗口。


5032F6C1-9EB5-4497-977F-60164DFBCDB3.png

执行效果如下:


E4E1A6F3-7DDD-4566-BB06-EB9CDDF82EAD.png

3、IDA Pro使用

shift + F12,查看字符串

4、ELF文件格式


170F9156-BF2A-4A47-90C5-0EA6126AD926.png

具体内容参考 : https://blog.csdn.net/mergerly/article/details/94585901

  • .text --- 存放程序的汇编字节码


    EE88ADDD-BD82-4D51-A5C7-12DC8D03C65E.png
  • .data/.rodata 段**
    用来存放已初始化的全局变量,以及已初始化的局部静态变量

但是尝试的时候没找到.bss段

猜测是因为没有给可写的权限?因为.bss段是可写的。不对

用其他的程序来看

image.png

5、内存mapping介绍
配合pwngdb使用

6、gcc的使用

  • 安全编译选项:-no-pie / -pie (关闭 / 开启)
    开启PIE功能,编译器就会随机化ELF文件的内存装载基址。

7、常用的X86汇编指令

jne 0x40000   // 当 eax 不等于 0 时,跳转到 0x40000 地址
jz 0x40000    // 当 eax 等于 0 时,跳转到 0x40000 地址

8、pwngdb/peda使用
q 退出

peda:start 程序名

32位程序通过栈传递参数,64位先通过寄存器传递参数,多的再通过栈传递。

rbp指向栈底,一般都和返回地址有关

9、IDA中查看栈结构
esp是栈顶,计算的时候不看他
ebp是栈底,计算的时候是通过ebp的差值来计算大小的

10、ROP技术---返回导向编程(Return-oriented Programming)
中心思想:利用现有的或自己构造system("/bin/sh")

07.21

1、ssh连接,提升使用舒适感
Secure Shell(SSH),RSA加密

颜色配置原来一直不成功,参考知乎,修改成功
https://www.zhihu.com/question/36048211

通过ssh连接服务器

密码登陆的方法:
服务器端: /etc/init.d/sshd restart
netstat -tlnp | grep ssh可以查看是否启用了ssh服务

客户端:ssh -p22 root@IP地址

退出登陆使用的是exit

这样是通过密码登陆了。虽然可以登陆,但是每次都要输入密码比较麻烦。可以通过证书来登陆。

客户端 ssh-keygen -t rsa
将公钥复制到服务器端,并在/etc/hosts.allow文件中加入 sshd: <A machine's IP>

参考 https://www.cnblogs.com/luckycn/p/8515391.html
尝试发现还需要密码,

问题应该出在公钥证书复制出错了。

手动把文件复制过去改名字,成功!!!!
纪念一下:


image.png

2、解决昨天的问题

  • 一个小程序,里面字段不全,没有.bss是为什么?
    答:因为Mac系统和Linux系统内部实现是不一样的,在Linux中查看就有了。
    readily -a test
image.png
  • 原来编译的时候 -static报错,也是因为平台不同。
image.png
image.png

3、ret2text

image.png

/root/.gdbinit改为使用pwngdb
start day2_level0 即可开始调试

步入函数,step进入
得到buf的实际地址 0x7fffffffe340


image.png

得到距离是0x88字节,即136字节。返回地址是用rbp+8来计算的


image.png

IDA中查看 callsystem函数地址为:0x400596,在服务器中也是不变的。由于是.text段,所以叫ret2text.

from pwn import *
r = process('./day2_level0')
payload = 'a'*136
payload += p64(0x400596)
r.recv()
r.sendline(payload)
r.interactive()
image.png

如果不直接存在system("/bin/sh"),需要自己构造。

image.png

3、题目-fd
http://pwnable.kr/play.php

  • ls,显示三个文件。打开fd.c
image.png

输出flag的条件是:buf的值为LETMEWIN

反应太慢了,虽然卡片很可爱,但是体验感不佳。

题目-collision
提示是MD5碰撞


image.png

要求输入的长度是20并且check_password的结果要和hashcode相同。

4、题目:tell me something
64位文件,IDA打开,查看main函数,有溢出


image.png

查看gg函数


image.png

首先file文件,run,start

image.png

5、ret2shellcode
.bss是可执行的。

07.22

1、ret2shellcode
NX,Windows中对应的是DEP,不能直接执行栈上的数据。这里NX是关闭的。

首先得到s的地址是:0xffffd4cc

9C4F1797-A1FF-4226-8C3F-71E4DE5C399B.png
9B8272E7-7942-4B5F-874A-4FE02CE4B691.png

思想比较简单:只有覆盖到返回地址。但是由于程序本身会复制一次,所以在覆盖的时候就存放shellcode,会把shellcode复制到我们要执行的区域中。

2、ret2syscall

32位,静态链接。
.bss和stack 都不可执行


CFDA553A-4C32-4A2F-BCA6-3CC130563DBC.png

918DBB18-4D72-4D64-B11F-EF70C349FB07.png

位置0xffffd4bc,

37418894-C5F0-4EB5-88A9-DF588B4919F5.png

得到偏移 0x70

关于gadge,参考文章https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=42530&highlight=pwn

其中讲到ret指令的本质是pop eip,gadget是以ret/jmp/call等指令结尾的一小段汇编指令,它属于指令区,可以执行,可以绕过NX保护。

到这里看不懂了,开始看视频看能否理解。

07.23

荒废了一天,罪过。

07.24

1、re2syscall
前提:打开了NX使得栈不可执行。
ROPgadget的使用
使用报错

image.png

错误原因是:python2.7/ROPGadge 中没有scripts/ROPgadge。自己拷贝一个 sudo cp -r scripts /usr/local/lib/python2.7/dist-packages/ROPGadget-6.3.dist-info .版本要换成自己相应的版本,解决!

安装个python3,参考https://www.cnblogs.com/lemon-feng/p/11208435.html

E6AC473A-C32B-4324-81C5-3FC9D97274B6.png

ROPgadget --binary ./二进制文件名(需要先编译)


ABCC81ED-8554-4309-921F-9C1779F588F9.png
image.png

经询问,如果开了PIE,地址就会从0x0000000开始
/bin/sh: 0x00000000000008f8

内容思路懂了,但是没有操作。

2、ret2libc
如果在上面那种情况中,没找到system() 、execve()这种系统级函数,就需要使用ret2libc
需要寻找基址+偏移

例题:64位。

收到的某个函数的地址要进行
puts_addr = eval(r.recvline()[:-1])
[:-1]是为了去掉接收的时候最后面的换行符,eval()是python内置函数,把其内容转换为数字。区分linux中的命令eval,它是执行两次的意思 =。=

payload = 填充到返回地址 + gadget改变寄存器rdi(rdi传入字符串 bin/sh的地址) + 要调用的system函数的地址

题目文件有一点问题,也没有操作成功。

但是!上一题puts出了libc的地址,如果没有给libc的地址,需要

  • 手动构造puts或writes等输出函数
  • 将其参数设置成为某个函数的got表,从而输出表中的实际地址,泄漏内存

实际操作步骤如下:

泄漏出libc的地址,调用puts.plt(puts.gots)

07.25

1、DASCTF 10:00 —— 15:00
虚假的签到题


D4047D99-4347-4F71-A74C-D8EE74D370A3.png

32位,IDA打开。(这个和真实的可能是略有差异的,因为IDA毕竟是动态调试。)

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空