首页
论坛
课程
招聘
[原创]CTF2017第二题分析(qwertyaa)
2017-10-27 14:27 1090

[原创]CTF2017第二题分析(qwertyaa)

2017-10-27 14:27
1090
首先下载,拖入ida和od分析,以为是要使输入8个字符满足:

v1 && v0 && v1 != v0 && 5 * (v1 - v0) + v1 == -1890567614 && 13 * (v1 - v0) + v0 == -279954878 && 
v1 && v0 && v1 != v0 && 17 * (v1 - v0) + v1 == -207009661 && 7 * (v1 - v0) + v0 == 866732163
然后做到怀疑人生,按同余方程去解解出两个互异的唯一解...根本无法同时满足...我甚至暴力都用了...
然后估摸着要另辟蹊径,莫非其实允许输入16个字符使得他们分别满足解?
尝试了一下得到以下结果:
马上反应过来有栈溢出啊,仔细一看scanf("%s",...),又看到处理成功的汇编代码的地址是0x40102F,于是得到key:123456781234/^P@(当时怀疑是不是多解?)
提交,未果,无奈加了CTF群,看看别人对这个问题的反馈,看聊天记录,看到KEY必须是数字或字母组合。
瞬间理解了为什么开头几个函数和后面几个分的这么开的原因有木有!!!(为了凑好key是数字或字母组合

.text:00401130 dd 4800h dup(0) 
.text:00413130 retn
然后看代码,到处都是跳转,太花了,retn是不可能的,于是选择0x413131为栈溢出攻击所跳转到的地址。

我开始以为比如JL、JNL都是各种分支,情况数好多!!!(萌新还去学习了一下各种跳转的含义。)
期间尝试了将 栈溢出攻击所跳转到的地址上移十格(下面bad中跳转的地址由xor算出),得到key: 123456781234!1A(但不是数字或字母组合...)
后来发现其实这些命令都会跳转到同一个结果,类似于VMP的虚拟机数量...( 萌新在网上偶尔看到的。)
然后假定所有sub指令后的判断才是真的(不一定是紧跟着的判断,可能先是JL/JNL,然后都绕到一个/种JE去判断)
最后手工记录下去花指令后的汇编代码,如下(代码中数字均为16进制,注释除外):
add esp,-10
xor eax,eax
mov dword ptr ds:[41b034],eax
pop eax
mov ecx,eax//开头4位字符
pop eax
mov ebx,eax//第4-8位字符
pop eax
mov edx,eax//(2次)第8-12位字符
mov eax,ecx
sub eax,ebx
shl eax,2
add eax,ecx
add eax,edx
sub eax,eaf917e2
je ok1//(a-b)*4+(a+c)=0xeaf917e2u(算式中abc分别是开头4位字符/第4-8位字符/第8-12位字符,下同)
bad:
pop eax
xor eax,1210e
xor eax,dword ptr ds:[41b034]
jmp eax//输出BAD
ok1:
add eax,ecx
sub eax,ebx
mov ebx,eax
shl eax,1
add eax,ebx
add eax,ecx
mov ecx,eax
add eax,edx
sub eax,e8f508c8//(a-b)*2+(a-b)+a+c==0xe8f508c8u
je ok2 jmp bad ok2: mov eax,ecx mov eax,ecx sub eax,edx sub eax,0c0a3c68//(a-b)*2+(a-b)+a-c==0x0c0a3c68u
je ok3 jmp bad ok3: pop eax//413131 xor eax,8101 mov edi,eax xor eax,eax stos dword ptr es:[edi] call x pop eax push eax mov edi,eax push 4e000969 pop eax xor eax,edx stos dword ptr es:[edi] xor eax,10a3e stos dword ptr es:[edi] xor eax,ebx xor eax,22511e14 stos dword ptr es:[edi] xor eax,61642d xor eax,dword ptr ds:[41b034] jmp eax//jump to 0x40102fu
简单分析一下,不难理解为解上个方程,ok3后的代码虽然难算,但三个方程下只有一个解了,这应该只是用于防止用奇特的技巧饶过前面的代码或直接找到成功点。
要解如下三个方程组成的方程组:

(a-b)*4+(a+c)=0xeaf917e2u

(a-b)*2+(a-b)+a+c==0xe8f508c8u

(a-b)*2+(a-b)+a-c==0x0c0a3c68u

观察后不难发现后两个式子可以解出c,然后去解出a和b:(大概根据数论理论,+-*操作假装没有算术溢出是没有关系的)

a=0x7473754au,b=0x726f6630u,c=0x6e756630u

改成字符,加上栈溢出攻击需要的11A,得到我们想要的key:Just0for0fun11A


[培训]12月3日2020京麒网络安全大会《物联网安全攻防实战》训练营,正在火热报名中!地点:北京 · 新云南皇冠假日酒店

收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回