Zj_W1nd's BLOG

逆向杂谈(持续更新)

2023/11/25

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
    其中参数表第一项为返回值类型,其次包含各个参数的类型

CATALOG
  1. 1. 2023.11.25 KeyPatch实践
  2. 2. 2024.2.3 hitctf_camp 逆向
  3. 3. 32位下函数调用约定
  4. 4. 名称修饰约定于操作符函数重载(32位 Visual Studio)