replace 리버싱 문제풀이
수정내역
- 2020.01.28 최초작성
1. 서론
- 메모 습관 기르기위해 옛날에 풀었던 문제들 정리해놓기 ㄱㄱ
- 문제출처: reversing.kr
2. write-up
문제는 다음과 같다. input 안에 알맞은 수를 입력하면 된다.
텍스트 섹션에 w 권한이 있는 것을 보니 내부에서 코드 변조를 하나보다.
어디서 변조하는지 확인해보니, 다음과 같은 함수포인터에 어셈블리를 직접 write 하는 것이 보인다.
해당 어셈블리는 다음 사진과 같이 EAX 위치를 NOP(0x90)으로 바꾸는 역할을 한다.
그럼 어디를 바꾸면 좋을까? “correct” 를 띄우는 부분의 직전의 코드가 jmp op에 의해서 분기가 달라진다. 이 부분을 NOP으로 바꾸면 되겠다.
input 값에 따라서 해당 EAX 값이 어떻게 변하는지 관찰하기 위해 0 을 넣어보았다. 그 경우 다음 사진과 같이 EAX 의 값이 0x601605CB 으로 변한다.
해당 EAX의 값을 0x00401071 이 나오도록 구현하면 jmp 대신 nop 이 채워지고 correct 부분의 어셈블리가 실행될 것이다. 식으로 표현하면 다음과 같다.
0x601605CB + input = 0x00401071
input = 0x00401071 - 0x601605CB
input = 2687109798 (10진수)
위에서 구한 답인 2687109798를 넣으면 다음과 같이 EAX의 결과가 나타난다. 결과는 예상한대로 0x00401071 으로 나타난다.
다음과 같이 nop 으로 변한 것을 볼 수 있다.
결과화면.