[어설픈] LOB 5번 orc 문제풀이

2019. 3. 17. 23:39System Hacking/[LOB] Hacker School


안녕하세요!

오늘은 LOB 5번

 orc 문제풀이를 해보겠습니다!


아래에 문제의 소스코드가 주어졌습니다!


직전 goblin 문제와 다른 점이

딱 하나 있죠?


맨 밑에 buffer를 0으로 초기화 해주는거요!

goblin에서 소스코드 해석 다 했지만

간단하게만 짚고 넘어가면!


1) 크기가 40인 버퍼, 정수 i 스택에 선언


2) argument 갯수 2개 이상으로 맞춰라!


3) 환경변수 못 쓴다!


4) argv의 48번째 값 \xbf이여야 한다!


5) 그리고 이 문제에서 추가된!

버퍼도 초기화 해주니 exploit 할 때 버퍼 쓰지마!

일단 tmp 폴더를 만들고

tmp 폴더에 

wolfman 프로그램을 복사합니다!


왜냐?

wolfman은 저희가 로그인한

orc 소유가 아니기에 

gdb로 실행을 못시켜요 ㅠㅠ




자 그리고 이제 gdb를 킵니다!

그리고 무엇을 할 꺼냐?

breakpoint를 걸어야죠!

어디에?


main 바로 시작하는 곳이요!

gdb의 맨 첫 부분이요!


왜 하필 거기?


왜냐면 저희가 버퍼를 이용못하니

다른 곳을 이용해야 겠죠?


그 공간은 바로 argv[1] 공간이에요!


저희가 argv에 값을 입력하면 

이 또한 stack 어디에 load가 되는데

저희는 그 부분을 찾을 꺼에요!


다행히 argv 의 값을 초기화 하는 부분은

없더라구요!



그래서 아래와 같이 breakpoint를 제일 앞에 잡고

argv[1]에는 shellcode를 입력해 봤습니다!


자! breakpoint가 걸린 상태에서!


스택 상황을

확인해보죠!

 맨 앞에 

0x00000002와 0xbffffb44가 보이시나요?


0x00000002는 argc의 갯수를 의미하고

0xbffffb44는 argv들의 주소가 담겨있어요! 

(여기의 경우 argv[0]과 argv[1]의 주소가 담겨있겠죠?)


이걸 어떻게 알았냐?

main 함수의 인자로 argc와 argv가 들어가잖아요!


앞에 있는 0x400309cb는 main 함수가 끝나고 

향하는 return 주소일거에요!




이후에 명령어로 

x/2x 0xbffffb44 이렇게 입력하면

(1) argv[0] 주소 (2) argv[1] 주소

이렇게  두 개가 뜨는데!


여기서 argv[1]의 주소를 gdb에 입력하면

argv[1]에 입력한 쉘코드가 나옵니다!

(여기에선 argv[1]의 주소가 0xbffffc54) 



저희가 return해야 할 주소가 나왔으니!

payload를 작성하면 되겠죠?


쉘코드 25byte + nop 19byte = 44byte

그리고 45,46,47,48 byte 부분은

return address!


그래서

일단 tmp 폴더에

쉘코드 + nop + ret address 했는데

illegal instruction이 떳네요! 


그래서 이번엔 바꿔서 

nop+ 쉘코드 + ret address 해서

원래 문제에다가 하니


아래와 같이 쉘이 따지네요!

고생하셨습니다!