2022-01-13 · 2분
专用寄存器
关于 CPU 专用寄存器的学习笔记——累加器、程序计数器、指令寄存器、MAR、MBR、状态/数据/地址寄存器——以及用户可见与用户不可见的区分。
2021-07-14 · 4분
这篇文章发布已超过两年,内容可能已过时。
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/
使用的程序: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" 比较。
使用的程序: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"。
使用的程序: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"
使用的程序: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 协助完成。
…