Logo WP

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))