我正在学习IOLI crackme0x02。我很清楚,在没有说明的情况下重写 0x8048451 处的跳转可以修补破解版。但是,我想更好地理解代码的作用。我的问题是我无法找到输入的密码所在的位置。
我解释了radare2显示有3个局部变量的内容。
│ ; arg int arg_22_2 @ ebp+0x5a
│ ; arg int arg_123 @ ebp+0x1ec
│ ; var int local_1 @ ebp-0x4
│ ; var int local_2 @ ebp-0x8
│ ; var int local_3 @ ebp-0xc
...
| 0x0804840c c70424618504. movl $str.Password:, (%esp) ; [0x8048561:4]=0x73736150 LEA str.Password: ; "Password: " @ 0x8048561
| 0x08048413 e804ffffff calll sym.imp.printf
| 0x08048418 8d45fc leal -4(%ebp), %eax
| 0x0804841b 89442404 movl %eax, 4(%esp)
| 0x0804841f c704246c8504. movl $0x804856c, (%esp) ; [0x804856c:4]=0x50006425
| 0x08048426 e8e1feffff calll sym.imp.scanf
| 0x0804842b c745f85a0000. movl $0x5a, -8(%ebp) ; [0x5a:4]=-1 ; 'Z' ; 90
| 0x08048432 c745f4ec0100. movl $0x1ec, -0xc(%ebp) ; [0x1ec:4]=-1 ; 492
| 0x08048439 8b55f4 movl -0xc(%ebp), %edx
| 0x0804843c 8d45f8 leal -8(%ebp), %eax
| 0x0804843f 0110 addl %edx, (%eax)
| 0x08048441 8b45f8 movl -8(%ebp), %eax
| 0x08048444 0faf45f8 imull -8(%ebp), %eax
| 0x08048448 8945f4 movl %eax, -0xc(%ebp)
| 0x0804844b 8b45fc movl -4(%ebp), %eax
| 0x0804844e 3b45f4 cmpl -0xc(%ebp), %eax
| ,=< 0x08048451 750e jne 0x8048461
| | 0x08048453 c704246f8504. movl $str.Password_OK_:__n, (%esp) ; [0x804856f:4]=0x73736150 LEA str.Password_OK_:__n ; "Password OK :)." @ 0x804856f
| | 0x0804845a e8bdfeffff calll sym.imp.printf
| ,==< 0x0804845f eb0c jmp 0x804846d
| |`-> 0x08048461 c704247f8504. movl $str.Invalid_Password__n, (%esp) ; [0x804857f:4]=0x61766e49 LEA str.Invalid_Password__n ; "Invalid Password!." @ 0x804857f
| | 0x08048468 e8affeffff calll sym.imp.printf
| | ; JMP XREF from 0x0804845f (sym.main)
由于我还不熟悉radare2,我在gdb之后放置了一个断点scanf (0x0804842b),并检查了局部变量。似乎他们和他们指向的地址都不是密码。
我对此有两个问题crackme:
输入的密码在哪里?
我不明白我在这里得到了什么:
Breakpoint 1, 0x0804843c in main () (gdb) x/4x $ebp-8 0xffffd1b0: 0x00000000 0x08048330 0x00000000 0xf7e1a72e因为 in
gdb x/4x通常会打印 4 个字节。
