Easy_ELF 2018-10-27

这是个暨南大学的校赛题目,第一次尝试破解ELF的题目,作此分享:

1、首先拖进IDA,认准32位(可以去试试64位的,但事实证明是32位的),目录如下:

Easy_ELF 2018-10-27_第1张图片
找到关键入口函数——main函数

然后F5,进入到伪C代码,如下:


Easy_ELF 2018-10-27_第2张图片
观察下main函数,可以知道write函数就是提示信息的函数,所以第一行应该是提示你输入一串东西(你的密钥)

所以sub_8048434()是输入函数。接着看到了if的判断函数,相信密钥就在里面,因为有cmd,看条件可以知道条件==1时才是正确输出,看看if下面的那个函数,如下:


Easy_ELF 2018-10-27_第3张图片

果然如果if成立,那么correct!,所以最后的答案在if中,走,去看看:


Easy_ELF 2018-10-27_第4张图片
因为要返回的是true,所以可以知道,非0,所以凡是return 0的都是不行的,反之,可以知道,括号里面都是不成立的,相反的。

所以,从题目可以知道一些信息,804A020 = 120,这个是新的值,它是通过与0x34u异或得到的,所以根据双重异或得原来的结果(最简单的加密算法)可以得到原来的804A020的值,804A021=49,804A022也异或,23也异或,24就是88,25没有信息非0(无用信息),拿脚本去运行下:


Easy_ELF 2018-10-27_第5张图片
成功得到我们的flag:L1NUX

在这里给个提醒,如果用python去写脚本会报错(之前我试过)因为python默认的是无符号的,而C++比较只能有符号位,会自动识别!大家可以记一下,负数转char用C++,而全是正数时,可以用python。

你可能感兴趣的:(Easy_ELF 2018-10-27)