2021-07-14 · 4

rev-basic 0~3 write-up

securityreversing

这篇文章发布已超过两年,内容可能已过时。

rev-basic-0~3 write up

查看更多

https://dreamhack.io/wargame/challenges/14/

https://dreamhack.io/wargame/challenges/15/

https://dreamhack.io/wargame/challenges/16/

https://dreamhack.io/wargame/challenges/17/


rev-basic-0 write up

使用的程序:radare2, ida7.2

用汇编看 main 时,写着 'Correct' 的语句正上方有 'test eax, eax'。

在 x86 汇编中,TEST 指令对两个操作数执行按位与(AND)运算。那么就需要分析返回 eax 值的正上方 "call section..text" 那里。

section..text 的汇编如下。一眼就能看出 "Compar3_the_str1ng" 是答案。

用 IDA 反编译看看。

如下,if 语句要为真,"sub_140001000" 需返回一个非 0 的数。

反编译 "sub_140001000" 可以看出它把 a1(用户输入)与 "Compar3_the_str1ng" 比较。


rev-basic-1 write up

使用的程序:radare2, ida7.2

这汇编代码好像在哪见过。0 和 main 相同,所以像 0 一样分析 "section..text"。

如上,可以看到它不断与某个数字比较。看那些数字的大小,像是 ASCII 码。

用 Python 或手动做也行,但我们用 IDA 吧。

这是 "section..text" 的反编译。在 IDA 中把鼠标放到 ASCII 码上按 "r",就会变成 Char 形式。按 "h" 还能变成 int 和 hex 形式。通过上面这些功能,我查出了 rev-basic-1 的 flag。

可以确认是 "Compar3_the_ch4ract3r"


rev-basic-2 write up

使用的程序:radare2, ida7.2

main 一样。同样分析 section..text 吧。

嗯.... 那里似乎能看到 flag,但还是分析一下:

rsp 是栈指针寄存器。也就是说会创建 0x18 大小的栈。用 jmp 跳转,看下一段

0x14000101e      4883f812       cmp rax, 0x12              ; 18
0x140001022      7324           jae 0x140001048

可以看到似乎循环 0x12(18) 次。是个循环。

继续读下面的汇编,可以看到它以 4 字节为单位间隔比较。被比较的数组似乎是

"lea rcx, qword str.Comp4re_the_arr4y" 这里。确认一下,

如上可以看到间隔 4 字节的 flag。这个也用 IDA 确认,

正如我们所分析,循环 0x12(18) 次,每次比较 4 字节。查看 aC 数组,

可以看到 flag 存在。"Comp4re_the_arr4y"


rev-basic-3 write up

使用的程序:radare2, ida7.2, python3

main 又一样,所以跳过,分析 "section..text"。

这个也和上一题一样

0x14000101e      4883f818       cmp rax, 0x18              ; 24
0x140001022      732f           jae 0x140001053

可以看到有循环,把循环的条件设为 i,

0x14000102f      movzx eax, byte [rcx + rax] //eax = [rcx = 被比较的字符串 + rax = [rsp] 栈指针]
0x140001033      movsxd rcx, dword [rsp] //rcx = [[rsp] 栈指针]
0x140001037      mov rdx, qword [arg_8h] //rdx = [用户输入]
0x14000103c      movzx ecx, byte [rdx + rcx] //ecx = [用户输入 + rcx : 这里是循环的 i 值]
0x140001040      xor ecx, dword [rsp] //ecx ^ rsp : 把 (用户输入 + i) 与 i 做 xor 运算。
0x140001043      mov edx, dword [rsp] //edx = rsp : 把 i 值放入 edx
0x140001046      lea ecx, dword [rcx + rdx*2] //ecx = rcx + rdx*2 : rcx = xor 运算后的值 + rdx = i 值 * 2
0x140001049      cmp eax, ecx //比较 eax 和 ecx : 把 flag 与 (rcx = xor 运算后的值 + rdx = i 值 * 2) 比较

("str.I_gtcgBf"[i]) == ((*input[i]) ^ i) + i * 2

似乎是这样比较。做这个太麻烦了...

如果 rdx、edx 之类让你混淆,请看 [黑客] - [黑客] 寄存器

总之既然这样预测了,可以写成 Python 代码,但先用 IDA 确认一次。

看着好像不太对,但和我们预测的一模一样!!!那么把运算写成 Python 吧?

values = [0x49, 0x60, 0x67, 0x74, 0x63, 0x67, 0x42, 0x66, 
        0x80, 0x78, 0x69, 0x69, 0x7b, 0x99, 0x6d, 0x88, 0x68,
        0x94, 0x9f, 0x8d, 0x4d, 0xa5, 0x9d, 0x45]

for i in range(0, len(values)):
    print(chr((values[i] - 2 * i) ^ i), end='')

把 ((*input[i]) ^ i) + i * 2 的式子逆算,用 (input[i] - i * 2) ^ i 计算。

flag:"I_am_X0_xo_Xor_eXcit1ng"


原文(韩语): tistory — 发布于 2021-07-14,已迁移至本博客。本翻译由 AI 协助完成。

评论

删除这条评论?

相关文章

rev-basic 0~3 write-up · 나봄하랑