다른 문제들에 비해 좀 복잡하다.

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 에 있는 문장이랑 똑같다.

 

임의의 플래그 파일을 만들어 실행시켜보니 제대로 나온다.

이걸 이제 서버에 연결해서 실행시키기만 하면 된다!

플래그가 잘 나오는걸 볼 수 있다.

728x90

'해킹 > 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

+ Recent posts