[CodeEngn] Basic RCE L11 풀이
- 리버싱/CodeEngn
- 2020. 2. 25. 18:49
CodeEngn Basic RCE L11 풀이
패킹된 파일의 OEP와 Stolenbyte를 찾는 문제로 Basic RCE L09 문제와 거의 동일한 문제이다.
Stolenbyte에 대한 설명은 [CodeEngn] Basic RCE L09 풀이 (StolenByte) 를 참고하기 바란다.
CodeEngn Basic RCE L12 풀이
UPX로 패킹된 해당 파일의 EP는 pushad로 시작하고 있다. pushad 명령을 사용하면 현재의 레지스터 상태가 스택에 저장되게 된다.
그리고 OEP로 점프하기 직전에 저장한 레지스터를 복원할 것이기 때문에 레지스터값이 저장된 스택에 하드웨어 bp를 걸어주었다.
그럼 다음과 같이 popad로 스택에 저장되어 있던 레지스터 값을 다시 복원하는 부분에서 bp가 걸리게 된다. 그리고 아래에 메시지 박스 함수의 인자들로 보이는 값들이 push되고 있다. 실행 코드에 있던 인자값들이 여기로 가져와진 것이다. 따라서 해당 인자값들을 복원해주지 않고 OEP에서 덤프를 떠버리면 파일이 정상실행되지 않는다.
push 3개 아래에 있는 push0은 jmp로 간 결과 복원해줄 필요는 없는 값으로 확인되었고 애초에 jmp 직전 스택값에도 인자 3개가 push되어있으므로 StoleByte는 위에 있는 push 3개 코드이다.
jmp를 통해 아래의OEP로 갈 수 있다. 이미 jmp 직전에 MessageBoxA 함수의 인자 3개값이 스택에 push된 상태이기 때문에 함수 실행에는 문제가 없다.
하지만 덤프를 떠야하면 문제가 달라지므로 아래와 같이 총 12바이트의 옵코드를 40100C-C 인 401000 주소에 복원해준다.
파일이 정상실행 되는지 확인해보기 IAT 정보를 복원한 후 덤프를 생성한다.
파일이 정상 실행되는 것으로 보아 StolenByte가 잘 복원된 것으로 보인다.
'리버싱 > CodeEngn' 카테고리의 다른 글
[CodeEngn] Basic RCE L14 풀이 (0) | 2020.02.27 |
---|---|
[CodeEngn] Basic RCE L13 풀이 (.net 디컴파일) (0) | 2020.02.26 |
[CodeEngn] Basic RCE L10 풀이 (ASPack) (0) | 2020.02.24 |
[CodeEngn] Basic RCE L09 풀이 (StolenByte) (0) | 2020.02.23 |
[CodeEngn] Basic RCE L08 풀이 (0) | 2020.02.22 |