O2
O2级别的优化?#
./O2: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by ./O2)
GLIBC版本太低,使用 wsl ubuntu-preview 即可运行
无法拖入ida查看
这里似乎需要修复ELF什么的
如果不修,每次Debug都得重启IDA,恼的很
2024-04-22 看大佬wp后更新
拖入DIE查看,发现是 ==AMD64, 32位==
elf header被修改了,将EI_CLASS改为2即可修复(1是32位,2是64位)
直接动态调试,就可以看到了
这里需要一些寄巧,
程序的入口是 libc,程序里面有等待用户输入的话,就会卡住
所以单步调试,看哪里卡住了,就重新调试,
F7
进去就行这个方法比较灵车,还是得问问其他方法
直接搜字符串,找到一些东西,有点像密钥/密文
364d4d5c3e387e00421c597a0a7302144d5b70087e064619567336297d151f567
((void (__fastcall *)(_BYTE *, char **, char **))sub_564A5C2065C0)(v15, &off_564A5C209360, &off_564A5C209340);
off_564A5C209360 是输入的字符串 off_564A5C209340 是 PaluCTF
O2:000055E1F1448344 lea rdx, off_55E1F144B340 ; "PaluCTF"
O2:000055E1F144834B call near ptr unk_55E1F14485C0
看汇编,得出算法
key = b'PaluCTF'
inp = b'aaaaaaaaaaaaaaaaaaa'
for i in range(len(inp)):
print(hex((key[i % len(key)] + inp[i]) & 0x7F))
动调验证之后,正确
"PaluCTF" 下面有两个函数,第一个是加密输入,第二个执行之后,[rsp+68h+var_40] 变成 26h,如果不是 54h,就输出 Wrong!
检验长度的地方
EXP#
enc = '364d4d5c3e387e00421c597a0a7302144d5b70087e064619567336297d151f56770a7935424f2a780643'
key = b'PaluCTF'
r = []
for i in range(0, len(enc), 2):
r.append((int(enc[i:i+2], 16) - key[(i // 2) % len(key)]) & 0x7F)
print(''.join(chr(c) for c in r))