CTF_GAME
运行程序可以看见是一个类似夹娃娃机的程序
分析
1 | void __fastcall main(__int64 a1, char **a2, char **a3) |
在welcome函数中有开启三个线程来检查程序是否被更改
1 | pthread_create(&v5, 0LL, check_if_debug_is_be_hack, 0LL); |
check_if_debug_is_be_hack
函数检查debug是否开启check_if_level_is_be_hack
函数检查level是否大于5,与一个level增加会减少的值是否正常check_if_life_is_be_hack
函数life是否大于6小于0
如果在一个线程中发现异常则程序退出
输入’a’,’d’指令后抓钩会相应移动,输入’v’可进入debug模式
1 | switch ( input ) |
由于debug模式未开启isdebug
为0,不能进入debugmode
开始破解
用ida-patch将程序逻辑更改如下,直接进入debugmode
1 | case 'v': |
并且更改check_if_debug_is_be_hack
逻辑
1 | while(1) |
并且进入debugmode
后,可以看见里面还有一层检测,更改如下
1 | if ( 1 ) |
程序运行后键入v进入debugmode
1 | __int64 __fastcall debugmode(__int64 a1, __int64 a2, __int64 a3) |
选择Debug on
即可开启debug模式,然后选择Level up
,最多可将level加至4
更改level_up
中的代码
1 | __int64 __fastcall level_up(__int64 a1, signed __int64 a2, __int64 a3) |
改为
1 | if ( safe_code >= 0 ) |
经测试无用,于是最后一个level尝试手动通过
删除main函数中刷新flag位置的函数
1 | if ( v11 > 5 - level ) |
更改catch
函数中对于抓取的判定
1 | __int64 __fastcall catch(__int64 a1, __int64 a2, __int64 a3) |
将
1 | if ( v13 < v14 % 6 ) // 随机数大于safecode就未成功抓取 |
改为
1 | if ( v13 < v14 % 6 ) // 随机数大于safecode就未成功抓取 |
更改完毕后按以上思路操作,未出flag,于是尝试手动通过5关,弹出一半flag
根据弹出的提示,搜索字符串find a race