ret2text
32位程序。开了NX,栈不可执行
ida中查看可知使用了gets函数,存在栈溢出漏洞。在secure函数中存在调用system(“/bin/sh”)的代码。地址为0x804863a
找偏移量
断在了0x62616164,也就是baad
找到偏移量为112
payload:
1 | from pwn import * |
ret2shellcode
没开NX,可以在栈中执行shellcode
最后一行可以看到有可读可执行的段
程序gets s,复制到buf2,可以在ida中看到buf2在bss段,地址为0x0804A080
运行程序,查看一下这一个bss段是否可执行
1 | b main |
这个题目好像有点问题,正常应该和wiki中的一样查出来是rwx,但是我查到的buf2所在的bss段权限为rw-,但是思路是没啥问题的
1 | from pwn import * |
ret2syscall
32位,开了NX
gets(),存在栈溢出漏洞
这里我们使用文件里的gadget来构造一个系统调用。
构造:
1 | execve("/bin/sh",NULL,NULL) |
程序是32位,通过gadget我们要设置寄存器的值:
- 系统调用号,eax=0xb
- 第一个参数,ebx为指向/bin/sh的地址,或者执行sh的地址
- 第二个参数,ecx=0
- 第三个参数,edx=0
寻找gadgets
1 | ROPgadget --binary ./ret2syscall --only 'pop|ret' | grep 'eax' |
使用pop eax ; ret
,记录地址0x080bb196
下面找包含ebx
的
1 | ROPgadget --binary ./ret2syscall --only 'pop|ret' | grep 'ebx' |
有很多,正好有一条pop edx ; pop ecx ; pop ebx ; ret
,可以一下控制3个寄存器,记录地址0x0806eb90
/bin/sh
的地址,0x080be408
int 0x80
的地址,0x08049421
然后查看一下偏移(32位的程序我一般使用gdb的插件gef,和wiki里一样)
1 | gdb ret2syscall |
断在了baad这里
偏移量为112
payload:
1 | from pwn import * |
ret2libc1
32位,NX,在栈中的数据没有执行权限
gets(),栈溢出
可以看到存在system函数
也存在/bin/sh
payload:
1 | from pwn import * |
"b"*4
是填充在system的返回值处,因为不需要返回,所以随便设置了。
ret2libc2
32,NX
gets(),栈溢出漏洞
和ret2libc1一样存在system的plt,地址为0x08048490
1 | objdump -d ret2libc2 | grep "plt" |
但是没有/bin/sh
的字符串了,可以栈溢出后利用gets函数读取它。
观察到bss端有一个buf2,0x804A080
使用vmmap
可以发现这个bss段是可写的
测偏移的方法和上面一样,测出来的112
所以思路是,先进行栈溢出,把gets的plt填在返回地址上,然后程序会调用gets,这时输入/bin/sh
,在gets的plt后面写上system的plt,gets的内容存储到的地址buf2,调用system,把buf2的地址填上作为system的参数
可以参考:https://blog.csdn.net/AcSuccess/article/details/104321534
payload:
1 | from pwn import* |
ret2libc3
一样的栈溢出,但是这一次找不到system也找不到/bin/sh了
system函数属于libc库,程序调用函数使用动态链接libc.so,其中的函数之间相对偏移是固定的。即使程序有ASLR保护,也只是对于地址中间位进行随机,最低的12bit(3位十六进制数字)不会改变。
因此可以泄露libc的某个函数的got表地址,来得到库的版本,从而调用其他函数。
由于 libc 的延迟绑定机制,我们需要泄漏已经执行过的函数的地址。
查看重定位节(-R)
在ida找到了puts的plt地址,0x08048460
也可以用objdump -d ret2libc3 | grep 'plt'
查找plt表地址
因此我们可以利用puts来打印__libc_start_main
函数的got表地址。同时在ida得知__libc_start_main
函数的地址为0x0804a024
puts函数的返回地址是_start函数(或者main函数)(start函数
_start函数地址为0x080484D0
偏移测试为112
但是因为一些原因,libc的版本没有找到…所以这个题先放在这了