2020/4/19进度记录
Windows环境下32位汇编语言程序设计
526/739
加密与解密
127/908
IDA Pro权威指南
8/463
526/739
127/908
8/463
人生中的第一道攻防题被我做出来了哈哈,看雪名次第86(我没报名提交不了),但当时只有85个人提交哦
补充:然后后来写完这篇文章我就去报名了,114名了。。。
其实答案早就算出来了,不知道干啥我跑到atoi里看半天(不熟悉C/C++的后果,立个Flag,学好C++)
https://ctf.pediy.com/game-season_fight-135.htm
spring2020.rar
1. IDA
2. OllyDbg
打开IDA,看String,发现good
跳转到使用这个数据的代码段
看sub_401750的xrefs,我们来到401a3b
我们发现
.text:00401A3B call sub_401750
这一行会导致弹出“right”;
text:00401A42 call sub_401790
这一行会导致弹出“wrong”
所以我们要让eax=50h
我们从00401A36开始倒着推分析:要让eax=50h,在
.text:00401A34 sar eax, 1
这一行前面要让eax=A0h
.text:00401A31 cdq
.text:00401A32 sub eax, edx
再看这个cdq,cdq把EAX的第31bit复制到EDX的每一个bit上,换句话说:
如果eax为正数,edx将会为0
如果eax为负数,edx将会为-1
然后分析“sub eax, edx”:
如果eax为正数,eax=eax-edx=eax=0
如果eax为负数,eax=eax-(-1)=eax+1
要让eax=A0h,eax为负数的话怎么弄都不可能让eax变成A0h,因为给1个负整数+1是必然小于等于0的
所以eax一定是正数,且eax=A0h
现在我们开始正着推(好像我分析的时候是先正着推的?我忘了。。。)
打开OD,在401a1b处下断点,然后运行-输入“123456”-按确认,程序被中断了,然后eax为字符串的“123456”
然后F8往后走,发现atoi被调用了,且“123456”是参数
atoi是把字符串变成整数的参数
所以在调用完毕后,eax中存放的就是输入的字符串的整数型
F8走到call atoi后面,发现eax果然就是输入的字符串的整数型
(1E240h=123456)(十六进制1E240=十进制123456)
回到ida,.text:00401A28开始的那三行仔细看看就知道完全没用(秘制代码),我们正着推的和逆着推的总算碰到一块了
放进去的是A0h的十进制字符串就对了,A0h的十进制字符串就是这道题的答案:160
526/739
119/908
8/463
刚学到这个感觉有点模糊/抽象,所以稍作整理
创建一个Event返回一个句柄(失败返回0)
ResetEvent
手动复位;FALSE的话当测试事件的函数返回时,对象会自动被复位到这里就很容易懵逼,复位?置位?测试事件?没关系等待再看,看到后面不懂再会过来一起看就行
(懵逼2连)
等待Event:等待一个Event置位或超时就返回
换句话说,则个函数的作用就是等待一个Event对象
如果在WaitForSingleObject
调用时,事件对象状态为复位的话,线程将会在WaitForSingleObject
处等待(不返回),直到事件对象状态变为置位或超时(超时时间:dwMilliseconds)后,WaitForSingleObject
才会返回。如果调用CreateEvent
时,参数bManualReset指定FALSE的话,WaitForSingleObject
返回后会又自动把这个Event的状态给换成复位
现在再看看CreateEvent
中的参数bManualReset应该也就不懵逼了。测试事件的函数在这里就是WaitForSingleObject
所以总结下,复位状态就得等,置位了才能过去(这话感觉好直白)
手动将Event状态设为置位
手动将Event状态设为复位
signaled
nonsignaled
500/739
76/908
8/463