一次菜鸟级二进制逆向
某次在 windows 上升级 aria2c 时忘记在用的是改过最大线程数的版本,一不小心覆盖掉了,然而那个版本确实有些久远了(上次的详情),何不拿最新版重新修改一份呢!
虽然咱是菜鸟,工具要准备好哦。Radare2(可选 GUI Cutter)和 IDA 免费版,杀人越货必备神器。
0x0
首先前往 GitHub 下载到最新版本 aria2c.exe
。然后来观察下,启动 aria2c 时指定线程数多于 16 会发生什么吶:
C:\Tools\aria2\> .\aria2c.exe --max-connection-per-server=32
Exception: [AbstractOptionHandler.cc:69] errorCode=28 We encountered a problem while processing the option '--max-connection-per-server'.
-> [OptionHandlerImpl.cc:184] errorCode=1 max-connection-per-server must be between 1 and 16.
Usage:
-x, --max-connection-per-server=NUM The maximum number of connections to one
server for each download.
Possible Values: 1-16
Default: 1
Tags: #basic, #http, #ftp
很好,打印出了错误信息,抛出异常的位置,以及正确的用法。OptionHandlerImpl.cc
抛出的错误信息看起来应该是按条件拼凑而成,追踪分析多半很困难,正确用法的说明 The maximum number of...
这一大段描述文本,猜测应该是作者手写的字符串,从这里开始搜索分析应该不难。
0x1
进入 radare2,我们来搜索这段文本:
C:\Tools\aria2\> r2 .\aria2c.exe
-- ❤️ --
[0x004014e0]> / The maximum number of connections
Searching 33 bytes in [0x8eb200-0x8ec000]
hits: 0
Searching 33 bytes in [0x8eb000-0x8eb200]
hits: 0
Searching 33 bytes in [0x8ea200-0x8eb000]
hits: 0
Searching 33 bytes in [0x8ea000-0x8ea200]
hits: 0
Searching 33 bytes in [0x8e7000-0x8ea000]
hits: 0
Searching 33 bytes in [0x8e2000-0x8e7000]
hits: 0
Searching 33 bytes in [0x8e1200-0x8e2000]
hits: 0
Searching 33 bytes in [0x8a3000-0x8e1200]
hits: 0
Searching 33 bytes in [0x8a2200-0x8a3000]
hits: 0
Searching 33 bytes in [0x87b000-0x8a2200]
hits: 0
Searching 33 bytes in [0x7f5000-0x87b000]
hits: 1
Searching 33 bytes in [0x7f4600-0x7f5000]
hits: 0
Searching 33 bytes in [0x7ee000-0x7f4600]
hits: 0
Searching 33 bytes in [0x7ed600-0x7ee000]
hits: 0
Searching 33 bytes in [0x401000-0x7ed600]
hits: 0
0x00804655 hit0_0 .-per-server=NUM The maximum number of connections to one .
[0x004014e0]>
哇哦,最后一行,我们找到了这一串文本的地址 0x00804655
0x2
现在进入 IDA 搜索引用,按 G 定位至 0x00804655
:
可以看到这里有一处数据交叉引用 sub_4C2040
,继续跟上:
有三处常量写入内存 [rsp+188h+var_158]
,[rsp+188h+var_160]
以及 [rsp+188h+var_168]
。注意这里是文本 0x00804655
唯一的引用,--max-connection-per-server
参数的上下限检查应该就在附近。关注这里写入内存的两个常量 1
和 10h
,正好是上下限 1-16,猜测有可能正是目标值。
0x3
修改 0x4c3d70
指令的值为 0FFh
,导出 exe 尝试运行,传入参数 32 可以正常运行!好咯,任务达成,最大线程数修改为 256!
0xf
网上搜索偶尔看到有神人只用 vim 就能 hack 二进制,佩服的不要不要😂大体上是这样做的,在 vim 里 :%!xxd
把程序转十六进制文本,然后猜测关键逻辑的指令,用一串 opcode 去搜索到目标,改完后再 :%!xxd -r
转回二进制保存。