首页
社区
课程
招聘
[原创]看雪.TSRC 2017CTF秋季赛第二题WriteUp
2017-10-28 11:35 2780

[原创]看雪.TSRC 2017CTF秋季赛第二题WriteUp

2017-10-28 11:35
2780
首先两个验证函数有四个方程,写成C++代码大概就是

if (v1 && v0 && v1 != v0 && 17 * (v1 - v0) + v1 == -207009661 && 7 * (v1 - v0) + v0 == 866732163)
     if (v1 && v0 && v1 != v0 && 5 * (v1 - v0) + v1 == -1890567614 && 13 * (v1 - v0) + v0 == -279954878){
}


这实际上是个同余方程组,但是用 17 * (v1 - v0) + v1 == -20700966和 5 * (v1 - v0) + v1 == -1890567614作差,发现左边是偶数右边是奇数,无解。

接下来就要找实际验证位置,这里写一下我怎么注意到的。

1、在printf的时候可以看到上面有不少指令反汇编错了,猜测花指令/SMC。
2、在OD分析状态下中间突然冒出来一个retn,猜测下面可能是一个新的函数(虽然那个retn是有问题的)。
3、删除OD分析,可以看到00413131处有一个add esp,-10,而esp就是输入字符串位置,那么基本就实锤了。

当然这里是要利用scanf %s的栈溢出覆盖返回地址到00413131,所以flag最后四位是11A(还有自动补充的\0)

接下来就没什么说的了,一步一步跟呗,这里贴当时随手记的过程


key = 01234567890111A

0123 4567 8901 0111A

A     B    C    D

esp - 4 : 00413131
esp - 8 : C
esp - 12 : B
esp - 16 : A

mov eax,0
mov [0041B034],eax
pop eax ; A
mov ecx,eax
pop eax ; B
mov ebx,eax
pop eax : C
mov edx,eax ; ecx: A ebx:B edx:C
mov ecx,eax
sub eax,ebx ; A-B
shl eax,2 ; (A-B)<<2
add eax,ecx; (A-B)<<2 + A
add eax,edx; (A-B)<<2 + A + C
sub eax,0xEAF917E2 ; (A-B)<<2 + A + C - 0xEAF917E2
jnz end
add eax,ecx
sub eax,ebx; A-B
mov ebx,eax ; !!!!! ebx = A-B
shl eax,1 ; (A-B)<<1
add eax,ebx ; 2(A-B)+A-B
add eax,ecx ; 2(A-B)+A-B+A
mov ecx,eax ; !!!!! ecx = 2(A-B)+A-B+A
add eax,edx ; 2(A-B)+A-B+A + C
sub eax,0XE8F508C8; 2(A-B)+A-B+A + C- 0xE8F508C8
jnz end
mov eax,ecx ; eax = 2(A-B)+A-B+A
sub eax,edx ; 2(A-B)+A-B+A  - C
sub eax,0x0C0A3C68; 2(A-B)+A-B+A  - C -0x0C0A3C68
mov eax,D ; pop eax
xor eax,0X8101 ; D^0x8101
mov edi,eax 
xor eax,eax
stos es:[edi] ; edi = 0041B030 eax = 0
call 00413841
    pop eax ; eax = 00413835
    push eax
    mov edi,eax
    push 4e000969
    pop eax ; eax = 4e000969
    xor eax,edx ; 4e00969^C
    stos es:[edi] ; edi = 00413835 eax = 4e00969^C
    xor eax,10A3E; 4e00969^D^0x10A3E
    
......省去一亿个废话

end:
pop eax ; D
xor eax,0x1210E ; D^0x1210E
xor eax, [41B032] ; D^0x1210E^0
jmp 0040103F ; bad-register code

最后得到三个方程

(A-B)<<2 + A + C - 0xEAF917E2 = 0

2(A-B)+A-B+A + C- 0xE8F508C8 = 0

2(A-B)+A-B+A - C -0x0C0A3C68 = 0


非常好解,解出来注意是小端序拼成flag就没问题了。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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