hgame2021-fake debugger题解

要点

本题属于非常规注册机类似题目题解,基本逻辑就是简化的模拟动态调试(如OD),在输入flag之后只展现模拟的eax ebx ecx寄存器和zf标志位,然后来求得目标flag。

难点:识别加密算法以及寄存器储存的值含义,理解后写了个单字符!xor的简化

烦点:只能单步,不能F8,这里使用pwntools写了个半自动化简化

难点理解

每个字符的校验分为两步,其中ecx保存下标,第几位

第一步时,eax代表input[ecx]^ebx的结果(input就是一开始输入的flag)

第二步时,eax还是上一步的结果没有改变,但是ebx变成了真正的flag运算的结果,最后会比较eax和ebx的值

相等即校对成功。

因此只要得到两部的ebx,就可以算出真正的flag原本的样子了。

xor单字符逆过程python代码:

while 1:
 result = input()
 compan = input()
 orgin  = result^compan
 print('ascii: ',orgin,' char: ',chr(orgin))

烦点简化

直接用我用pwntools写的代替nc就行,修改代码中的测试值,然后运行会直接运行到底

#!/usr/bin/env python
# coding=utf8
from pwn import *

context.log_level = 'debug'  # 显示调试的信息
context.terminal = ['gnome-terminal', '-x', 'bash', '-c']  # ?

p = remote('101.132.177.131', 9999)

p.recvuntil("Please input you flag now!\n")
# 自己一个个尝试补全全部的内容,注意hgame{}的格式,结尾没括号会出bug
input = 'hgame{tRy_y0us3lf_i_c@nt_pUt_@nsWer_h3r3}' 
p.sendline(input)
p.recvuntil("OK,let's debug it! You can 'Step' by 'Space'!\n")

while 1 :
    p.recvuntil("--------------INFO--------------\n")
    p.sendline(' ')

具体做法

  1. 常驻打开第一个python代码运行
  2. 运行第二个python代码运行
  3. 在运行结果中读取最后两个ebx(这里叫做ebx1,ebx2吧)
  4. 在1打开的窗口中输入

    • ebx2
    • ebx1
  5. 读取输出对应位的flag字符,然后修改第二段代码的对应位的字符
  6. jmp 2(重复从2开始的步骤,直到出现 you got it )

最后就能得到flag:hgame{You_Kn0w_debuGg3r}

Last modification:February 19, 2021
如果觉得我的文章对你有用,请随意赞赏。咖啡(12RMB)进度+100%,一块巧克力(1RMB)进度+6%。
(赞赏请备注你的名称哦!后台记录中来自理工小菜狗)