看雪.安恒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
试一下,没错,本来想发个网站提交通过的图的,之前输了一次,成功了就不能再提交了,
看完了别忘了给个评分,谢谢大家
后面的字有点小,想把它调大点一调就卡死了, 来看看啦 感谢大佬分享
感谢楼主 感谢楼主 大佬无敌 谢谢分享 楼主的帖子不错,多发点~ 谢谢分享