crackme-wp

0x00

​ 老规矩,exeinfo看一下:

image-20221113214717253

​ 尝试使用手动脱壳未果,主要是找到一个popad之后用scylla脱壳不行,之后直接上动调了。

image-20221114185454751

​ 输入字符串的判断长度,长度必须为0x2A,也就是42。

image-20221114185631356

​ 上图为主要判断逻辑,每一个字符异或然后比较,比较不通过直接退出。

​ 直接上脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
ans = [
"t", "12",
"h", "4",
"i", "8",
"s", "14",
"_", "24",
"i", "5c",
"s", "4a",
"_", "3d",
"n", "56",
"o", "a",
"t", "10",
"_", "67",
"f", "0",
"l", "41",
"a", "0",
"g", "1",
"t", "46",
"h", "5a",
"i", "44",
"s", "42",
"_", "6e",
"i", "c",
"s", "44",
"_", "72",
"n", "c",
"o", "d",
"t", "40",
"_", "3e",
"f", "4b",
"l", "5f",
"a", "2",
"g", "1",
"t", "4c",
"h", "5e",
"i", "5b",
"s", "17",
"_", "6e",
"i", "c",
"s", "16",
"_", "68",
"n", "5b",
"o", "12"
]
for i in range(len(ans)//2):
ff = chr(ord(ans[2*i]) ^ int(ans[2*i+1], 16))
print(ff, end = "")

​ 最后快乐的得到flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75},嘿嘿嘿

0x01

​ 看其他师傅的wp。人家都是直接脱壳了,我这显得有点麻烦。

​ 最简单的,找nspack脱壳工具,脱完直接放ida里看。

image-20221114191948533

​ 分析一波,直接出来了。

0x02

​ 手动脱壳,非常重要,借鉴师傅的文章:

https://blog.csdn.net/xiao__1bai/article/details/120230397。

​ 自己用x32gdb对程序入口的pushad的ESP寄存器打硬件断点,直接运行到popad,之后用scylla脱壳,只不过当时被坑了一小波,如下:

image-20221114200333134

​ 我以为还有壳呢,没想到放到ida里直接出来了。。无语。

知识点1:ntdll.dll的作用。ntdll.dll是重要的Windows NT内核级文件。用白话说就是”NT 层 的 DLL“,描述了windows本地NTAPI的接口。当Windows启动时,ntdll.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。

知识点2:堆栈平衡原理&脱壳

  1. 就是在进入壳之前,会将所有的寄存器入栈(pushad),加壳后,再将所有的寄存器出栈(popad)。

  2. 几乎全部的压缩壳,部分加密壳。只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用。但是在何时下断点避开校验,何时下断OD才能断下来,这还需要多多总结和多多积累。

  3. 我们要知道壳如果要把原来加密或压缩的代码运行起来就必须要解压和解密原来的代码。而这一个过程我们可以看做是对代码段(code段)的写入。

  4. 解压完毕后,我们要从壳代码的区段JMP到原来的代码段的时候,可以看成是对代码段(code段)的执行。
  5. 假设我是一个壳的作者,一个EXE文件的有code段,data段,rsrc段…依次排列在你的内存空间中,那么我会怎么解码呢?我会先将code段解码,然后再将data段解压,接着是rsrc段…那么你不难发现,只要你在data段或者rsrc段下内存访问断点,那么中断的时候code段就已经解压完毕了。这时我们再对code段下内存访问断点,不就可以到达OEP了吗?
  6. 对data段下内存访问断点而中断是因为内存写入中断,目的是断在对data段的解压时,这时壳要对data段写数据,但是code段已经解压完毕。
  7. 对code段下内存访问断点而中断是因为内存执行中断,目的当然就是寻找OEP了。

知识点3:内存断点。是在所执行的代码的当前地址的一个字节修改为CC(int3)。当程序运行到int3的时候就会产生一个异常,而这个异常将交给OD 处理,把这个异常给EIP-1(所以才会停在上一条代码处)以后,就正好停在了需要的中断的地方(这个根据系统不同会不一样),同时OD在把上面的int3修改回原来的代码。

知识点4:硬件断点

image-20221114195639938

知识点5:汇编指令

1
2
pushfd //压入所有Eflag寄存器
pushad //压入所有通用寄存器

留言

2022-11-13

© 2024 wd-z711

⬆︎TOP