查壳
这题给了三个文件,一个32位exe,一个32位elf,一个64位elf。应该不需要查壳……
IDA
输入字符串,进行check_key判断。如果返回非0,则执行interesting_fuction
interesting_fuction:
对输入的v22(未知)进行加密处理,最后putchar输出
解题
这题本来想普通解,写个解密脚本。但是v22=v7 这俩都不知道,无法下手。于是决定 OD 动调32位exe,让程序绕过check_key检查,强行执行 interesting_function
OD跳过worry
004015A6 的跳转nop掉,绕过worry输出:
乱码……
既然OD动调不成功,改用IDA动调
IDA动调
很轻松地配合伪代码找到check_key判断,但是无法修改,百度后发现IDA动调不支持改寄存器值…… X﹏X
既然OD和IDA都不行,就决定用GDB试试水 (っ °Д °;)っ:
GDB
调试的关键依旧是让
GDB + 文件名 开始调试
b main 在主函数下断点
b *0x08048717 在check_key返回值这下断点(具体通过IDA动调找到对应地址)
n 单步步过……翻了好多页,眼睛都看花了,每次步过都是一页页的寄存器信息,看瞎了……
后面发现是我n傻了,continue忘记用了……按c继续运行,提示输入key。这里乱输123 。由上图可知输入后面就是check_key函数和判断check_key返回值。所以这里开始我们单步步过,慢慢观察。
运行到test eax eax,这里就是伪代码的:0if ( check_key((int)v22) )
这里我们用 i r eax 查看当前eax的值:果不其然,是不执行的0
用set $eax=1将eax的值修改为1
按c继续执行,看看会putchar啥玩意儿出来:
flag
flag_is_you_know_cracking!!!