[어설픈] LOB 2번 gremlin 문제풀이

2019. 3. 11. 21:51System Hacking/[LOB] Hacker School

안녕하세요!

오늘은 LOB의 두 번째 문제!

gremlin을 풀어보도록 하겠습니다!


우선 코드를 보니 아래와 같네요!

버퍼의 크기가 gate에 비해서

현저하게 줄었네요!

16 byte 밖에 안되네요 ㅠㅠ


그리고 argument가 2개보다 작으면 

argv error라고 뜨네요!


그리고 argv[1]의 값을

buffer에 복사하네요!

(여기서 취약점이 발생하죠! 얼만큼 copy할지 크기 지정이 없으니....ㅎㅎ)

그리고 printf함수가 buffer에 저장된 값을 출력하네요!



gate에서도 보셨듯이,

red hat linux 6.2에서는


스택 사이에 dummy값이 존재하지 않습니다!


[gremlin의 스택구조]

buffer (16byte)

EBP(4byte)

RET_ADDR(4byte)

.....(이후 스택) 


근데 저희가 gate에서 풀었던 것처럼

buffer랑 ebp를 합쳐도 20byte 밖에 안됩니다 ㅠㅠ

shellcode를 저기에 올리는 것 

무리인 것 같고...


그러면 ret_addr 이후 스택에 넣으면 되겠네요!

저기는 뭐 무주공산이니

저기에 shell code 마음껏 쓰고

 RET_ADDR에 shell code 시작주소 넣으면!

끝나겠네요!


그래서 마음껏 쓸 수 있는

RET_ADDR 뒤에 주소를 알기 위해

20개의 \x90 값과 

 ret_addr 0xbffffab0 값으로 

(0xbffffab0이 결국 저희가 찾아야 할 값인데.. 문제다풀고 풀이하는거라...)

채우고 gdb로 어디가 시작점인지

확인해 봤습니다!


breakpoint는 main+74에 걸었습니다!

main함수가 return 하기 직전에

ret_addr가 존재할 것이고

그 ret_addr 뒤로 저희가 shellcode를

입력했기 때문이죠!

그랬더니 아래와 같이 저희 shellcode가 저기 있네요!



x/x $esp+4를 해서 보니

바로 깔끔하게

shellcode 앞에 4byte가 나오네요!

(25 byte 쉘코드 사용했습니다)


그래서 

아래와 같이 payload를 작성했습니다!


a*24 (ret_addr 전까지)+0xbffffab0 (ret addr=쉘코드 처음 시작주소)+쉘코드 (25byte)

근데 segmentation fault가 뜨고

shell이 따지질 않았습니다!


물론 아래와 같이 core 파일 까본다음 

실제로 프로그램 상에선

어디에 우리의 shellcode가 위치해있는지

주소 위치 찾으면 되지만!

(gdb -c core로 오픈가능)


그래도 이 방법으로 무식하게 계속 시도했습니다!


그러다가 4,5번 정도 try 했는데 

안돼서 그냥 RTL로 풀어버렸습니다...


RTL하려면 제가 FTZ 풀이할 때

적어놨는데 스택을 아래와 같이 바꿔야 합니다


[gremlin의 스택구조]

buffer (16byte)

EBP(4byte)

RET_ADDR(4byte) 

aaaa(4byte)

/bin/sh주소(4byte)


RET_ADDR에는 system함수 주소가 들어가고!

aaaa는 system 함수의 return 주소인데 

어차피 저희가 먼저 쉘을 따기때문에 system 함수의 ret_addr은

상관이 없죠? 

( system 함수 호출 -> 쉘이 따짐 -> 다 종료되면 system함수 ret_addr 호출)


그래서 제가 FTZ에서 풀이 했던 것과 마찬가지로

아래와 같이 진행했습니다!


ldd로 어떤 라이브러리 사용하나 봤더니

/lib/libc.so.6을 사용하네요!

그래서 nm으로 아래와 같이 system 함수를 찾았습니다!


strings -tx 명령어로 /bin/sh 명령어 주소값도 찾았습니다!

 



그리고 바로 아래와 같이 payload를 짰습니다!


ret addr 전까지 a로 20개 + system함수 주소로 return하는 주소 + aaaa+ /bin/sh 주소


그랬더니 아래와 같이 shell이 따지고

비밀번호가 나오네요!


고생하셨습니다!