ELF-No software breakpoints
ELF-No software breakpoints 题目链接
0x01 IDA分析
下载二进制文件,IDA打开后发现,在start
函数中:1
2
3
4
5
6
7
8
9
10.text:08048096 mov eax, 3
.text:0804809B xor ebx, ebx ; fd
.text:0804809D mov ecx, offset byte_8049188 ; addr
.text:080480A2 mov edx, 33h ; len
.text:080480A7 int 80h ; LINUX - sys_read
.text:080480A9 xor ecx, ecx
.text:080480AB mov eax, offset start
.text:080480B0 mov ebx, 8048123h
.text:080480B5 call sub_8048115
.text:080480BA mov edx, ecx
其中,password读入byte_8049188
内存区域中,之后调用sub_8048115
函数进行一系列处理。sub_8048115(&start, 0x8048123)
为传入参数内容。start
为函数的代码段首地址,0x8048123
位代码段末地址,函数的返回值放入ecx
中。
sub_8048115
函数:1
2
3
4
5
6
7
8
9
10
11
12.text:08048115 sub_8048115 proc near ; CODE XREF: start+35↑p
.text:08048115 sub ebx, eax
.text:08048117 xor ecx, ecx
.text:08048119
.text:08048119 loc_8048119: ; CODE XREF: sub_8048115+B↓j
.text:08048119 add cl, [eax]
.text:0804811B rol ecx, 3
.text:0804811E inc eax
.text:0804811F dec ebx
.text:08048120 jnz short loc_8048119
.text:08048122 retn
.text:08048122 sub_8048115 endp
函数进入后首先计算长度sub ebx, eax
,即len = 0x8048123 - &start
。
之后循环计算出key
放入exc
中。循环次数为ebx
。计算过程为:1
2
3
4for i in range(len):
add cl, [eax]
rol ecx, 3
inc eax
之后继续分析:1
2
3
4
5
6
7
8
9
10
11
12
13
14.text:080480BA mov edx, ecx
.text:080480BC mov ecx, 19h
.text:080480C1
.text:080480C1 loc_80480C1: ; CODE XREF: start+5C↓j
.text:080480C1 mov eax, offset byte_8049155
.text:080480C6 mov ebx, offset byte_8049188
.text:080480CB ror edx, 1
.text:080480CD mov al, [eax+ecx-1]
.text:080480D1 mov bl, [ebx+ecx-1]
.text:080480D5 xor al, bl
.text:080480D7 xor al, dl
.text:080480D9 jnz short loc_80480F6
.text:080480DB dec ecx
.text:080480DC jnz short loc_80480C1
可以看出,将sub_8048115
函数的结果取出放入edx
中,ecx
赋值为25(0x19h)。
之后即为循环比较password,计算公式:
1 | password \oplus str = key |
1 | for i in len: |
计算password即可
0x02 源代码
1 |
|