白影poji 发表于 2020-5-11 22:34

看雪.安恒2020 KCTF春季赛第一题破解

题目很简单,大佬可以跳过

软件无壳,可以直接拖进ida,从字符串入手,view->open subviews->strings,来打开字符串窗口
字符串没加密点进去

对字符串按x看引用再点进去来的了代码处,当前逻辑跳不过这个提示,那就去上一层看看,sub_401750按x出现引用框点进去,

我注释了一下逻辑就很清楚了,jnz   short loc_401A42 ;修改它即可成功逆向
但我的目的不仅仅是这个,还要获取正确的flag,那还需要看看算法
前面几个函数没什么好说的,需要注意的是call:atoi这个函数,
atoi() 函数用来将字符串转换成整数(int),

这个函数只有一个参数就是输入字符串的指针,返回值存在eax中,
输入111,eax不应该是111吗?eax==6f 这是啥意思?
我觉得和进制有关,用计算器试一下,

原来6f就是10进制的111,剩下的汇编代码也很简单
00401A2B   .8945 E0       mov dword ptr ss:,eax   //eax==6f
00401A2E   .8B45 E0       mov eax,dword ptr ss://将6f放回eax,这两句无意义
00401A31   .99            cdq                                                   
00401A32   .2BC2          sub eax,edx
00401A34   .D1F8          sar eax,1
00401A36   .83F8 50       cmp eax,0x50
00401A39   . /75 07         jnz short spring20.00401A42// CDQ
该指令先把edx的每一位置成eax的最高位(若eax>=0x80000000, 则   edx=0xFFFFFFFF;若eax<0x80000000,则edx=0x00000000) ,再把edx扩展为eax的高位。
//SAR
SAR右移的时候,最高位不变容,最低位移入CF
例如, AL = 1110 1110, BL = 0110 1100, CL = 2
SAR AL,CL
AL = 1111 1011 SAR最高位不变

要想jnz跳转eax必须==50
50的二进制为0101 0000
左移一位为1010 0000==16进制的A0
A0<0x80000000所以edx==0
所以eax==a0==10进制的160

试一下,没错,本来想发个网站提交通过的图的,之前输了一次,成功了就不能再提交了,
看完了别忘了给个评分,谢谢大家


白影poji 发表于 2020-5-12 10:35

后面的字有点小,想把它调大点一调就卡死了,

1946010 发表于 2020-6-6 22:43

来看看啦

拿着雪糕 发表于 2022-2-1 13:00

感谢大佬分享

PDWORD 发表于 2022-2-6 22:53


感谢楼主

xZHX 发表于 2022-3-1 01:24

感谢楼主

Rrquk3 发表于 2022-3-1 05:07

大佬无敌

uYtUSF 发表于 2022-3-1 05:09

谢谢分享

XxrIL25901 发表于 2022-3-1 05:19

楼主的帖子不错,多发点~

tULZD 发表于 2022-3-1 07:21

谢谢分享
页: [1] 2 3 4 5 6 7 8 9
查看完整版本: 看雪.安恒2020 KCTF春季赛第一题逆向