2023.11.25 KeyPatch实践
也是好东西,由于GUI操作,大概知道这是干什么的了——这玩意能直接允许程序员跳过16进制机器码从汇编语言的层面对程序内容进行修改。我们的目的是修复一个ELF文件的格式化字符串漏洞。
理论上应该是搜索ELF中已有的"%s\0"
字符串地址,把那句给printf()
传参的关键语句传递的地址修改成这个字符串的地址?但是这样简单修改会导致一个问题,就是格式化字符串会解析一次地址,除非我们手动加一句为格式化字符串添加一个参数。只是只在栈上解析一次%s参数“应该”不会导致太大的问题,至少任意地址写肯定是没有了,程序没有栈溢出漏洞也没法任意地址读了。
- 这里用l3hsec2023的一道简单格式化字符串题目racecar为例进行一下尝试。主要是懒得再用docker挂载往出搞elf文件了,虚拟机开了docker之后又用不了,就用下现成的吧。
程序原本的格式化字符串漏洞很简单,flag已经被读取到了栈上,用格式化字符串把内容泄露出来就可以了。现在我们要修复这个漏洞,就要控制printf()
的参数传入。原本的汇编漏洞如下:
现在我们用keypatch,随便找个有名字的字符串,把这个地址push进去。
2024.2.3 hitctf_camp 逆向
32位下函数调用约定
-
Cdecl:调用者清理栈、
-
Stdcall(windowsapi):被调用者自己清理
-
fastcall:寄存器传递前两个参数(ecx和edx),其余类似stdcall
-
C++类方法默认第一个参数会用ecx传递this指针
名称修饰约定于操作符函数重载(32位 Visual Studio)
C:
-
stdcall: _name@argc
-
cdecl: _name
-
fastcall: @name@
C++:
-
stdcall: ?name@@YGargtable@Z
-
cdecl: ?name@@YAargtable@Z
-
fastcall: ?name@@YIargtable@Z
其中参数表第一项为返回值类型,其次包含各个参数的类型