ciscn 逆向wp

First Post:

Last Update:

babyre

需要注意的是密文的顺序,加点逻辑,让他自己打印出来

movAside

先说混淆原理:(66条消息) movfuscator混淆_mov混淆_Cherest_San的博客-CSDN博客

实现:(68条消息) movfuscator混淆_mov混淆_Cherest_San的博客-CSDN博客

这种题解混淆后也很难看,所以逻辑一定是简单的,不然没法逆,一般去看函数表

解决:ltrace 看函数表,可以发现到最后的比较就是输入的flag经过加密后与密文进行逐字符比较,如图:

image-20230601084724003

所以在ida里再在plt表里修改一下,使strcmp调用的时候跳转到put函数,让他把密文打印出来,之后dump(右键->patching->apply patches to)

密文的话进入data段第一个数据就是,(验证了程序本身是简单的),与输出的密文比较一下就看出来了

再使用pwntools的逐字符爆破脚本:

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
from pwn import *
context(log_level='debug')
flag = [0x67, 0x9D, 0x60, 0x66, 0x8A, 0x56, 0x49, 0x50, 0x65, 0x65,
0x60, 0x55, 0x64, 0x5C, 0x65, 0x48, 0x50, 0x51, 0x5C, 0x55,
0x67, 0x51, 0x57, 0x5C, 0x49, 0x67, 0x54, 0x63, 0x5C, 0x54,
0x62, 0x52, 0x56, 0x54, 0x54, 0x50, 0x49, 0x53, 0x52, 0x52,
0x56, 0x8C]
flag1 = ''
index = 0
while True:
for i in range(33, 127):
p = process("./moveAsidea")
p.recvline()
p.sendline(chr(i).encode())
p.recvline()
a = p.recvline().decode('ISO-8859-1').strip('\n')
print(flag1)
if index == len(flag):
break
if ord(a) == flag[index]:
index += 1
flag1 += chr(i)
p.close()
print(flag1)

emm,这个脚本嫖的,不太会写,不过原理就是输入一个字符看回显,手动也可以模拟这个过程,把映射表一个一个弄出来就行了……

效果:屏幕截图 2023-06-01 102558

ezbyte

学到了 try catch 块处理异常,C++异常处理(try catch)从入门到精通 (biancheng.net),这个网站讲的真不错

DWARF字节码,按栈展开,通过DWARF Expression将代码隐藏在栈展开过程中 (buaq.net)

DWARF字节码,使用readelf 就可以看到r12寄存器的值使用了4个表达式,解出来就是答案,但因为这个题简单可以这样直接手搓字节码,通解是用好几个脚本把栈展开的部分提取出来,并且可以转成伪代码