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

[Fedora Core 3] gate -> iron_golem 본문

War game/해커 스쿨 FC3

[Fedora Core 3] gate -> iron_golem

dool2ly 2015. 8. 22. 17:42

[gate@Fedora_1stFloor ~]$ cat ./iron_golem.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - iron_golem

        - Local BOF on Fedora Core 3

        - hint : fake ebp

*/


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

{

    char buffer[256];


    if(argc < 2){

        printf("argv error\n");

        exit(0);

    }


    strcpy(buffer, argv[1]);

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

}


Fedora core3부터는 redhat보다 제대로 된 ASLR이 적용되고, 라이브러리 주소가 0x00으로 시작되고, NX-Bit가 존제한다.  이 말은 즉 프로그램 내의 버퍼에 쉘코드를 입력할 수 없고, RTL chaining도 못쓰고, 스택과 힙 영역에서 쉘코드를 실행할 수 없단 말이다.



소스는 위와 같고 힌트는 fake ebp다.  다른 방법이야 많겠지만 힌트를 보아하니 SFP를 조작해야겠다..



먼저 buffer기준에서의 SFP의 위치를 알기위해 buffer+dummy의 크기를 알아보자.

(gdb) b *main+112

Breakpoint 1 at 0x8048440

(gdb) r DDDDDDDD

Starting program: /home/gate/iron_gole1 DDDDDDDD

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


Breakpoint 1, 0x08048440 in main ()

(gdb) x $esp

0xfeefef80:     0x00000000

(gdb) x/24 $esp

0xfeefef80:     0x00000000      0xfeefefd4      0x0070b423      0x0072ca0e

0xfeefef90:     0x44444444      0x44444444      0x00000000      0x00000000

0xfeefefa0:     0x00000000      0x0072cad0      0x007279b8      0x0071f338

0xfeefefb0:     0x00719b88      0x00000003      0x00719e40      0x00719e70

0xfeefefc0:     0x0177ff8e      0x0804824c      0x00718fb4      0x007196a4

0xfeefefd0:     0x0804824c      0xfeeff0a8      0x0070b642      0x0804818c

(gdb) x $ebp

0xfeeff098:     0xfeeff0f8


보다시피 0xfeeff098-0xfeefef90=0x108 즉 264byte다. 



이번 문제에서는 <execl+3>을 사용할 것인데, 먼저 execl함수의 원형은 아래와 같다.

[int execl( const char *path, const char *arg, ...);]


execl은 첫번째 인자(ebp+8)를 실행한다.. 그렇다면 main의 SFP를 ASLR이 적용안되는(고정된) 영역을 가리키는 주소-8로 덮어씌우고 execl이 프롤로그를 실행하지 않고 바로 동작 하게 된다면 main SFP를 그대로 ebp로 쓸 수 있게 된다.



그럼 fake ebp+8이 가진 주소가 가리키는 값을 파일명으로 가진 쉘 실행파일을 만들어주고, 페이로드는 

[ 더미(264) | fake ebp | execl+3 ]이 되겠다.



--풀이--


Comments