다른 문제들에 비해 좀 복잡하다.
Stack canary 를 제외한 다른 보호기법들은 다 적용되어 있다. 그렇다는건 버퍼 오버플로우를 통해서 풀면 된다는 것이다.
일단 IDA로 따보면
print_flag라는 수상한 함수가 있는데 기억해두고,
main 에서 값을 받아 select_func 에 넘겨준다.
select_func에는 dest와 v3 변수가 있는데 dest에 src 인자를 31바이트 복사한다.
dest와 v3간의 거리는 30바이트이기 때문에 src에 31바이트 값을 넣으면 v3 변수의 영역 1바이트를 침범한다.
little endian 프로그램이기 때문에
맨 뒷 자리가 가장 낮은 주소에 들어가고,
맨 앞 자리가 가장 높은 주소에 들어갈 것이다.
그렇다면 dest(낮은곳)에서 올라와서 딱 한바이트 침범한다면
v3의 가장 낮은 주소 한바이트를 침범할 것이다.
그 가장 낮은 주소는 주소의 맨 뒷 자리일 것이고,
그렇다면 함수 two의 주소가 0x565556ad이면,
0x565556ad 이 부분을 바꿀 수 있다는 것이다.
아까 위에서 print_flag 란 수상한 함수가 있다고 한걸 기억하고 있다면,
print_flag의 주소를 찾아보지 않을수가 없다.
찾아보면 print_flag의 주소는 0x565556d8,
공교롭게도 함수 two의 주소와 차이가 단 맨 뒷자리밖에 차이가 나지 않는다. 그렇다면 0x565556ad를 0x565556d8로 바꿔야 하니 select_func의 인자 src의 값을 30자리를 아무 값으로나, 그리고 맨 뒤 한자리를 d8로 하면 v3의 값이 print_flag의 주소값으로 바뀌지 않을까?
이 문구, print_flag 에 있는 문장이랑 똑같다.
임의의 플래그 파일을 만들어 실행시켜보니 제대로 나온다.
이걸 이제 서버에 연결해서 실행시키기만 하면 된다!
플래그가 잘 나오는걸 볼 수 있다.
'해킹 > writeup' 카테고리의 다른 글
10. PLT & GOT (0) | 2021.07.19 |
---|---|
12. HackCTF - RTL_World (0) | 2021.07.18 |
8. HackCTF - x64 Simple_size_BOF (0) | 2021.07.11 |
7. HackCTF - 내 버퍼가 흘러넘친다!!! (0) | 2021.07.11 |
6. DreamHack - basic_exploitation_000 (0) | 2021.07.11 |