欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

实验吧-证明自己吧(超详细)

程序员文章站 2022-05-15 09:54:11
...

Crackme拖到IDA里查看


实验吧-证明自己吧(超详细)


可以看到,程序通过eax跳转,而eax的值很有可能是上面那个call    sub_401060决定的。

 

进入到sub_401060查看,可以看到最后的跳转代码有两个,一个是将eax清零,是错误跳转,一个是将eax赋值1,是正确跳转

实验吧-证明自己吧(超详细)


直接F5查看代码,关键代码如下:其中a1是传入函数的一个指针,指向我们输入的字符串,

这段代码大致就是将传入的字符串与0x20进行异或,然后将程序存储的一串字符进行减5,然后将两个字符串比较,如果相等就返回1,既成功,否则失败

实验吧-证明自己吧(超详细)


到这里已经很清楚了,然后用OD来找程序存储的另外一字符串就可以了,首先用ida查看那段代码的地址,在option中设置,

 

 实验吧-证明自己吧(超详细)

 实验吧-证明自己吧(超详细)



这里解释一下ida里的一串代码,repne scasb在代码中出现了很多次,作用就是计算字符串长度,edi中存放要计算的字符串,ecx中存放算好的字符串长度,eax中存放要查找的字符,如果是0的话就是计算字符串长度

 
lea     edi, [esp+1Ch+var_10]   
or      ecx, 0FFFFFFFFh         设置循环次数-1 
xor     eax, eax                设置搜索内容0 
xor     edx, edx
repne scasb                     一直重复搜索到EDI字符串末尾的0
not     ecx                    得到搜索次数,也就是字符串的完整长度
dec     ecx                    -1得到字符串不包含末尾0的长度 


转到OD,转到上述地址,然后F2下断点,F9运行到刚下的断点处,运行程序,发现程序固定的字符串长度为14,

 

一路运行,直到到比较两个字符串的位置,

实验吧-证明自己吧(超详细)



找到固定字符串所在位置,然后读取出14个字符,分别为0x63,0x52,0x14,0x43,0x4B,0x69,0x53,0x73,0x4F,0x65,0x14,0x53,0x59,0x01

 

最后一步,用python解出flag,代码如下:

a=[0x63,0x52,0x14,0x43,0x4B,0x69,0x53,0x73,0x4F,0x65,0x14,0x53,0x59,0x01]

for i in a:

    print(chr(i^0x20),end='')




相关标签: CTF 实验吧