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의 주소값으로 바뀌지 않을까?