Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags more
Archives
Today
Total
관리 메뉴

난 정말 최고야 멋있어

CTFLearn - Jumper 본문

카테고리 없음

CTFLearn - Jumper

n00bh4cker 2019. 12. 13. 00:54

IA32를 알고있는지 물어보는 문제

근데 어셈블리가 AT&T 방식이라 조금 보기 힘들었다;;

buffer = ebp-10
count = ebp -c


 0804848f :
 804848f:       55                      push   %ebp
 8048490:       89 e5                   mov    %esp,%ebp
 8048492:       83 ec 18                sub    $0x18,%esp
 8048495:       c7 45 f0 00 00 00 00    movl   $0x0,buffer

 //printf 
 804849c:       83 ec 0c                sub    $0xc,%esp
 804849f:       68 70 85 04 08          push   $0x8048570
 80484a4:       e8 87 fe ff ff          call   8048330 <printf@plt>
 80484a9:       83 c4 10                add    $0x10,%esp     //4개의 인자 정리  
 80484ac:       a1 20 a0 04 08          mov    0x804a020,%eax

 //fgets
 80484b1:       83 ec 04                sub    $0x4,%esp
 80484b4:       50                      push   %eax                     
 80484b5:       6a 04                   push   $0x4                         //int num =4
 80484b7:       8d 45 f0                lea    buffer,%eax
 80484ba:       50                      push   %eax                             //char*str = ebp-10
 80484bb:       e8 80 fe ff ff          call   8048340 <fgets@plt>
 80484c0:       83 c4 10                add    $0x10,%esp       //4개 인자 정리        


 80484c3:       c7 45 f4 00 00 00 00    movl   $0x0,count
 80484ca:       eb 0d                   jmp    80484d9 <jump+0x4a>

 < jump+0x3d>:
 80484cc:       8b 45 f0                mov    buffer,%eax 
 80484cf:       83 c0 05                add    $0x5,%eax           
 80484d2:       89 45 f0                mov    %eax,buffer   
 80484d5:       83 45 f4 01             addl   $0x1,count        


 <jump+0x4a>:
 80484d9:       83 7d f4 07             cmpl   $0x7,count
 80484dd:       7e ed                   jle    80484cc <jump+0x3d> 
 


 80484df:       8b 45 f0                mov    buffer,%eax       
 80484e2:       ff d0                   call   *%eax <--- What address does this jump to??
 80484e4:       90                      nop
 80484e5:       c9                      leave
 80484e6:       c3                      ret
 80484e7:       66 90                   xchg   %ax,%ax
 80484e9:       66 90                   xchg   %ax,%ax
 80484eb:       66 90                   xchg   %ax,%ax
 80484ed:       66 90                   xchg   %ax,%ax
 80484ef:       90                      nop

요기는 나만의 작은 핸드레이

void jump()

    char* buffer = null;

    mem_804A020 = printf(어쩌고 저쩌고);

    fgets( buffer , 4 , mem_804A020 );

    for(int count=0 ; count <= 7 ; count++)

    {

            *buffer +=5;

    }

    *(buffer)();

    return;

}

 

 

 

주의해야 할 점이 있다면...

fgets 의 두번째 인자의 4는 마지막 널문자열까지 포함한 4글자로 사실상 3글자까지 밖에 입력을 받지 못한다

이때 문제에서 입력값으로 jump를 준다고 했으므로 fgets 호출 이후 스택의 모양을 생각해보면

ebp-10:

 0x6a (j)

ebp-f:

0x75 (u)

ebp-e:

0x6a (m)

ebp-d:

0x00(\0)

[ebp-10] = 0x006A756A (인텔CPU => 리틀 엔디안)

 

count 가 0부터 7까지 총 8번 반복하므로 40 = 0x28

 

0x006A756A + 0x28 = 0x006D7592

 

따라서 플래그는 0x6D7592이 된다