본문 바로가기

2. Reversing (리버싱)

(75)
[2020.11.07]CodeEngn Challenges Basic RCE L13 ~ L16 라이트업 L13. 정답은 무엇인가 프로그램을 실행시키니 다음과 같은 화면이 출력되었다. 내용을 살펴보니 패스워드를 입력하라는 문자열만 출력되었다. 무작위의 문자열을 입력하니 다시 시도하라며 다시 입력을 기다리고 있었다. 프로그램 분석을 위해 Ollydbg에서 해당 프로그램을 실행해보았다. 위와 같은 오류창이 출력되면서 Ollydbg에서 프로그램을 실행할 수 없었다. PEiD로 해당 프로그램이 어떤 구조로 이루어져 있는지 분석해보았다. 분석한 내용을 확인하니 해당 프로그램은 NET을 이용하는 마이크로소프트 Visual C#으로 작성된 코드인 것을 확인할 수 있었다. Visual C#으로 컴파일 된 파일은 기계어로 되어 있기 때문에 인간이 사용하는 고급언어로 변환하는 과정이 필요하다. 이와 같이 기계어를 고급언어로 ..
[2020.10.10]CodeEngn Challenges Basic RCE L09 ~ L12 라이트업 L09. StolenByte를 구하시오 Ex) 75156A0068352040 Upx로 패킹된 것을 확인한다. 언패킹을 해주었다. 언패킹 해주고 올리 디버거로 열었는데 MessageBox를 보면 출력할 값이 없는 것을 확인. 이 부분이 stolenbyte일 것이라고 추측. Stolen byte? 패킹된 바이너리를 언패킹 할 때의 과정을 방해하기 위한 방법으로, 프로그램의 일부 바이트를 별도의 영역에서 실행되게 하여 OEP를 다른 위치로 가장하고 덤프를 쉽게 하지 못하도록 구현한 기법이다. 패커가 패킹을 진행할 때 원본 코드 중 일부를 다른 곳으로 이동 시킨 코드로써, 주로 엔트리 포인트 위의 몇 줄의 코드이다 ★ 올바른 프로그램을 얻기 위해서는 패킹 과정에서 떼어진 StolenByte를 함께 복원해야 덤프..
[2020.09.26] CodeEngn Challenges Basic RCE 라이트업 L05 ~ L08 L05. 이 프로그램의 등록키는 무엇인가 PEiD 프로그램을 통해서 05.exe가 패킹되었는지 확인한다. EP Section을 확인한 결과, UPX로 패킹되어 있다는 것을 확인할 수 있다. 패킹된 실행파일은 언패킹을 하기전에 PUSHAD 명령어를 통해서 레지스터의 상태를 저장해 놓고 언패킹이 완료되었을 때 POPAD 명령어를 통해서 레지스터의 상태를 복구한다. 하지만 이번에는 UPX 패킹 툴을 사용하여 언패킹한다. 언패킹하고 다시 PEiD를 통해 05.exe를 확인한다. 올리디버거에서 Search for > All referenced text strings를 클릭하여 코드에서 참조되는 문자열 목록을 확인한다. 성공했다는 메시지 문자열 위치에 있는 등록키 찾고 ID와 PW를 입력한다. 성공 메시지가 출력된..
[2020.9.19]CodeEngn Challenges Basic RCE L01 ~ L04 라이트업 L01. HDD를 CD-Rom으로 인식시키기 위해서는 GetDriveTypeA의 리턴값이 무엇이 되어야 하는가 GetDriveTypeA 함수는 디스크 드라이브가 이동식, 고정, CD-ROM, RAM 디스크 또는 네트워크 드라이브인지 확인하는 함수이다. 올리디버거에서 MessageBoxA 함수 살펴보면 출력 메시지 내용을 알 수 있다. GetDriveTypeA 리턴값 보기 위해 GetDriveTypeA 함수까지만 실행한다. 그리고 EAX 레지스터 (리턴값)을 확인하면 리턴값이 3이라는 것을 알 수 있다. EAX 레지스터가 3이라는 것은 드라이브에 고정 미디어가 있다는 의미이다. HDD를 CD-Rom으로 인식시키기 위해서는 리턴 값이 5여야 한다. Eax는 dec(-1 해준다)를 두 번 거치면서 000000..
[2020.06.16] 리버싱 핵심원리 | Hello World 문제 예전에 언젠가 푼 적이 있는 문제지만, 기억이 나지를 않아 한번 더 풀어보았다. 먼저, EP인 4011A0 주소에서 Step Info F7을 이용하면 40270C 함수로 이동 가능하다 ​ 붉은색 글씨의 A들= 코드에서 호출되는 API함수들의 이름이다 우리가 원문 소스코드에서 사용한 코드들이 아니라는 뜻이다 이것은 Visual C++에서 프로그램 실행을 위해 추가시킨 Visual C++ Stub Code이다 ​ (정리2: 40270C 안에 들어와서 보니 함수 젤 끝에 4027A1이 있더라. 여기에 근데 RETN함수가 써졌다) ​ (정리3: 그래서 이 명령대로 돌아온다면, 아까 실행한 주소 바로 다음인 4011A5로 가게 되는것이다) ​ (정리4:4027A1에 RETN명령어는 함수에 끝에서 사용되며, 호출된..
[2020.06.16] Reversing.kr | Position 문제 http://reversing.kr의 Position 문제를 풀어보도록 하자. 문제를 클릭하면 Position.zip 파일이 다운받아진다. Position.exe 파일을 열면 다음과 같은 프로그램이 실행된다. ReadMe.txt 파일을 보면 시리얼 번호가 76876-77776일때 name을 찾고 password를 찾는 문제임을 알 수 있다. 비밀번호는 ***p 이다. 문자열을 검색해 Correct!로 이동한다. Position.00011740 함수를 호출하고 결과에 따라 Correct와 Wrong으로 분기되는 것을 볼 수 있다. 리턴값이 1이어야 Correct가 된다. Position.00011740 함수 내부로 들어가 살펴보자. Position.00011740 함수에서는 Name을 입력받은 후 조건을 ..
[2020.06.02] Reversing.kr | Replace 문제 http://reversing.kr의 Replace 문제를 풀어보도록 하자. 문제를 클릭하면 Replace.zip 파일이 다운받아진다. zip파일을 풀고 Replace.exe 파일을 실행하면 다음과 같은 내용을 확인할 수 있다. 숫자를 입력하고 Check 버튼을 누르면 에러가 발생한다. 먼저 Exeinfo PE 툴로 Replace.exe파일을 확인한다. 패킹이 되어있지 않으니 바로 Ollydbg로 분석을 시작한다. Ollydbg로 파일을 실행시켜 숫자를 입력하고 check를 클릭하면 0040466F에서 EAX에 0x90(NOP)을 저장하는데 이 부분에서 문제가 발생한다. 그 이유는 숫자를 입력하고 Check를 클릭했을 때 0040466F에서 접근할 수 없는 메모리(60160A9D)에 0x90(NOP)이라..
[2020.06.02] CSAW 365 | CSAW Reversing 1 | Reversing1 CSAW Reversing1 문제를 풀어보도록 하겠다. 아마도 리버싱 기초문제가 Reversing N의 이름으로 출제되는 것 같다. 미리 말하지만 아주아주 쉽다. 프로그램을 실행시키면 다음의 Flag 팝업창이 뜨는데, 이상한 한글이 뜬다. 한글패치가 안돼서 그런건가 싶지만 이미 가상머신 설치 시에 다 완료했다. Abort, Retry, Ignore 세 버튼을 다 눌렀을 때에도 아무런 반응이 없어서 우선 패킹여부를 확인한다. | PEiD PEiD로 확인해보니 패킹되어있지 않다. 올리디버거에서 프로그램을 열고 우선 F8로 탐색하고자 했다. 그런데 해당 부분을 지나고 난 후 Flag가 출력되었다... 그냥 속임수인가 했으나 해당 Flag를 입력하니 풀렸다...? | OllyDbg 그래도..