逆向攻防世界CTF系列45-Windows_Reverse1
逆向攻防世界CTF系列45-Windows_Reverse1
32位,upx壳
跟进sub_401000
发现传了a1也就是输入v5,这里的v1是ecx,看汇编代码发现,它也是被传递的参数也就是main里的v4
v4 = a1 - v1;求了一个地址差,v1一开始是0
*v1 = byte_402FF8[(char)v1[v4]]; 有点没看懂
v1一开始是0,v4是地址差
*v1 = byte_402FF8[(char)v1[v4]];
这里V1作为地址和v4作为地址差值执行的是v1+v4的操作,因为数组a[b]本质就是在数组头地址a加上偏移量b来遍历数组的,
也就是一开始是v4=a1-v1,v1为0,其实就是我们输入的第一个字符的位置,后面v1[v4]倒不如理解成v4[v1],v1会加加,就会遍历
byte_402FF8[xx]就是以这个地址为便宜去取字符
数组地址偏移从0x00402FF8~0x00403078
看上面的标识char byte_402FF8[]到哪结束
ASCII编码表里的可视字符就得是32往后了, 所以, byte_402FF8里凡是位于32以前的数统统都是迷惑项. 不会被索引到的,而这里0x00402FF8~0x00403017刚好是32个字符。那么后面有字符串就可以解释通了,它们是连在一起的。
最后v4得是DDCTF{reverseME}
写脚本
1 | enc = [ |
ZZ[JX#,9(9,+9QY!
flag{ZZ[JX#,9(9,+9QY!}
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Matriy's blog!
评论