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(' ')
具体做法
- 常驻打开第一个python代码运行
- 运行第二个python代码运行
- 在运行结果中读取最后两个ebx(这里叫做ebx1,ebx2吧)
在1打开的窗口中输入
- ebx2
- ebx1
- 读取输出对应位的flag字符,然后修改第二段代码的对应位的字符
- jmp 2(重复从2开始的步骤,直到出现 you got it )
最后就能得到flag:hgame{You_Kn0w_debuGg3r}