Reversing.kr 문제는 대체적으로 다 좀 어려운 것 같다 ㅡㅡ;;
숫자만 입력되는 입력칸 하나와 체크 버튼 하나가 달려있는 프로그램이다.
아래 칸에는 Wrong 이라고 쓰여있다.
어떤 값을 넣어서 저 칸에 있는 문자열을 바꿔야 할 것 같다.
앞에 군더더기 코드가 좀 있긴 하지만 EP는 어렵지 않게 찾을 수 있다.
우선 api 모듈을 살펴보자
DialogBoxParamA, GetDlgItemInt, SetDlgItemTextA 등등 텍스트 박스조작 관련 명령어가 쌓여있다.
특히 GetDlgItemInt는 이름부터 숫자만 입력받는다는 api이다. 실행시켰을 때 제일 위에 있던 입력칸이 숫자를 받았으니까 이 API를 사용할 것이다.
이 부분에 BP를 걸고 실행시켜서 입력값을 줘보자. 필자는 12345678을 주고 진행할 것이다.
아주 중요한 분기문을 찾았다. 정답으로 보이는 루틴과 정체를 알 수 없는 함수호출, 정답으로 가는 길을 막고 있는 2개의 점프문을 찾을 수 있다.
우선 GetDlgItemInt의 반환값부터 보자
0xBC614E = 12345678 넣어준 값이다.
0x401060을 보면 4084D0에 반환값을 집어넣고 있다.
다음 0x40466F함수를 분석해보자
들어가면 바로 또 40467A함수를 호추하고 있다. 이 부분은 어떻게 한건지 모르겠다 40466F랑 404674사이에 있는 주소를 호출하는데 올리디버거엔 표시되지 않는다. ㄷㄷ
4084D0에 있는 값에 2를 더한 후, 복귀한다. ( 화살표로 표시해놨듯이 함수가 바로 다음 라인을 호출하고 있으므로 INC명령어는 2번 실행된다. )
그 후엔 우리가 입력값을 넣었던 4084D0위치에 601605C7을 더하고 2를 더한 뒤, 반환한다.
즉, 총 연산은 DWORD PTR DS:[4084D0] + 601605C7 + 4이 된다.
아직까지는 우리가 특정값을 입력해준다고 해서 흐름이 바뀔만한 루틴은 보이지 않는다.
바로 다음 루틴인
404690루틴을 분석해보자
EAX에 4084D0에 들어있는 값을 복사한 후 404689를 호출하는데 아까 나왔던 INC 4084D0 명령어이다. 하지만 이 부분은 무시해도 된다.
바로 이 다음 루틴에서 EAX를 가지고 연산을 하기 때문에 더 이상 4084D0에 있는 값은 상관이 없어지기 때문이다.
40466F를 호출하기 직전에 40466F위치에 있는 코드를 아예 바꿔버린다. C39000C6이라는 코드를 채우고 실행하고 있다.
실행시켜보니 EAX에 있는 주소에 있는 값을 모두 90 즉, NOP로 채워넣는 코드이다.
별 표시를 해둔 부분이 실행되면 EAX와 EAX+1에 있는 메모리에는 NOP가 들어갈 것이다.
즉 ,입력값을 적절하게 조절하면 2바이트값에 NOP를 채워넣을 수 있다.드디어 우리가 넣어줘야할 값을 유추해 볼 수 있을거같다.
가장 처음의 분기문을 보면서 어디를 바꿀지 생각해보자.
딱 저 2BYTE를 NOP로 바꾸면 바로 CORRECT가 출력되는 분기로 점프 할 것이다.
주소가 401071이므로 계산기로 0x401071 - 0x601605CB 를 10진수로 바꾼 값일 것이다.
끗!
'write-up > reversing.kr' 카테고리의 다른 글
position (0) | 2018.12.18 |
---|---|
ImagePrc (0) | 2018.12.05 |
Easy_CrackMe 풀이 (0) | 2018.12.03 |