手动脱壳
壳的类型分为压缩壳和加密壳



攻防世界crackme

将程序拖进x32dbg

进入断点

F9来到程序的入口点

可以看到pushfd pushad
也就是保存入口参数
F8执行

此时我们在ESP这个位置下一个断点
右键ESP

选择在转储中跟随
然后在下面下断点

硬件访问断点,双字,因为是32位
然后f9
当我们执行f9执行程序到断电位置的时候,就会来到popfd这个位置

继续执行

这里是一个大跳转,因为它没有指向
然后f7执行跟进

继续跟进

又来到push ebp,就是我们oep入口
点击插件

然后点击转储 保存
拖进ida
Shift+f12 点进去

Ctrl+x查看引用,找到main函数,f5反编译


逻辑是v4与byte_402130进行异或,然后与数组dword_402150进行比较
所以dword_402150是我们加密后的数据
v2 % 16说明key的长度是16
V4是我们输入的字符串
双击byte_402130看看

点击跳入新的十六进制窗口

可以看到this_is_not_flag刚好十六位
我们输入一个长度位42的字符串,然后让key叠加,然后与输入的字符串异或得到加密后的数据,也就是dword_402150
将它转化为数组

大小设置为42位


Shift+e导出来

|
flag="" a="this_is_not_flag" b=[0x12,4,8,0x14,0x24,0x5c,0x4a,0x3d,0x56,0x0a,0x10,0x67,0,0x41,0,1,0x46,0x5a,0x44,0x42,0x6e,0x0c,0x44,0x72,0x0c,0x0d,0x40,0x3e,0x4b,0x5f,2,1,0x4c,0x5e,0x5b,0x17,0x6e,0x0c,0x16,0x68,0x5b,0x12,0x48,0x0e] for i in range(42): flag+=chr(ord(a[i%16])^b[i]) print(flag) |
flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}
653

被折叠的 条评论
为什么被折叠?



