一、文件描述
- 正儿八经的exe文件,,可执行,如下图
- 911KB
- 32位
- 这个游戏程序的大致意思是,,有8个灯一起围成一个圈,,它们有亮和不亮两种状态,,按了某一个灯比如n,,它左右两边的灯的状态就会变。。游戏通过就是你按了数次后这8个都得亮,,然后你才能拿到flag、、、
- 比如灯亮与不亮用1和0表示,,一开始全都是暗的,用0 0 0 0 0 0 0 0表示,如果我按了2,,就变成1 1 1 0 0 0 0 0;接着继续按5,,变成1 1 1 1 1 1 0 0。这里还剩两个没亮,,
- 由于这个灯是围成一个圈圈,此时我按7 或者按8 都会将旁边一个变成0…
- 这。。。。
- 算了,还是破解试试看能不能拿到flag。。。
二、解题思路
- OD中打开,,,查看有没有明显的字符串,,,
- 这里我注意到两个,一个是“done!!!, the flag is”,
- 另一个是sorry,n error, try again\n
- 所以,,很明显,,第1张图中给出了,,the flag is 巴拉巴拉,我们在反汇编窗口中找到这句话,,,
- 反汇编窗口中,the flag is 这句话下面跟着好多字符串,,直觉告诉我,,这就是FLAG!!!
- 但是,要运行到这里是需要通过game的,,那我们就需要找到game的跳转,,然后给它直接跳转到这里,,记住这个address,,00C5E968h。
- 根据第二个字符串“sorry,n error, try again\n”,,我们直接定位到代码中
- 我们不想看到“sorry,,,”这句话,所以要在它之前,在输入n字符串之后,跳转到第一个字符串那里,,
- 在sorry上面,,有【jle】跳转和【cmp】(2)比较,再往上有个【jl】跳转和【cmp】(1),【cmp】(1)是拿着我们输入的n与正确的n进行比较。。如果输入小于0,就直接通过jl到“sorry,,”。
- 我们当然是关注第一个跳转【jl】, 一个简单&粗暴的方法就是直接将【jl 巴拉巴拉】跳转直接改为【jmp 00C5E968h】,,直接跳过输入失败也跳过输入成功,,嘎嘎,,试一波看看
- 然后F9运行,随便输入一个数字,,我输入的是4,然后就打印结果到DOS界面了。。
- 这里说明一下,这个方法因为粗暴,输出到dos后程序会中断,,然后,你点击忽略就行了。。。
- 另一个不那么粗暴的方法就是你去断点调试,,在原来那个地方【00C5E986】下个断点,然后F8调试到这个位置【00C5EBC1】就会在堆栈里看到
- Ok,,结束。。FLAG如下:zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}"