replace 리버싱 문제

replace

replace 리버싱 문제풀이


수정내역

  • 2020.01.28 최초작성

1. 서론

  • 메모 습관 기르기위해 옛날에 풀었던 문제들 정리해놓기 ㄱㄱ
  • 문제출처: reversing.kr

2. write-up

문제는 다음과 같다. input 안에 알맞은 수를 입력하면 된다.

replace

텍스트 섹션에 w 권한이 있는 것을 보니 내부에서 코드 변조를 하나보다.

text_section_w

어디서 변조하는지 확인해보니, 다음과 같은 함수포인터에 어셈블리를 직접 write 하는 것이 보인다.

write_text

해당 어셈블리는 다음 사진과 같이 EAX 위치를 NOP(0x90)으로 바꾸는 역할을 한다.

zero_input

그럼 어디를 바꾸면 좋을까? “correct” 를 띄우는 부분의 직전의 코드가 jmp op에 의해서 분기가 달라진다. 이 부분을 NOP으로 바꾸면 되겠다.

target

input 값에 따라서 해당 EAX 값이 어떻게 변하는지 관찰하기 위해 0 을 넣어보았다. 그 경우 다음 사진과 같이 EAX 의 값이 0x601605CB 으로 변한다. 해당 EAX의 값을 0x00401071 이 나오도록 구현하면 jmp 대신 nop 이 채워지고 correct 부분의 어셈블리가 실행될 것이다. 식으로 표현하면 다음과 같다.

0x601605CB + input = 0x00401071
input = 0x00401071 - 0x601605CB
input = 2687109798 (10진수)

zero_input

위에서 구한 답인 2687109798를 넣으면 다음과 같이 EAX의 결과가 나타난다. 결과는 예상한대로 0x00401071 으로 나타난다.

2687109798_input

다음과 같이 nop 으로 변한 것을 볼 수 있다.

success1

결과화면.

success2