'Reversing'에 해당되는 글 10건

  1. 2017.05.13 [Assembly] 기본 명령어
  2. 2017.05.10 [Shell coding] msfvenom 쉘코딩
  3. 2017.04.30 [Plaid CTF] zipper
  4. 2017.03.03 [2017codgate] RamG
  5. 2017.02.21 [Reversing.kr] CSHARP
  6. 2017.02.21 [Reversing.kr] Ransomware
  7. 2017.02.21 [Reversing.kr] Replace
  8. 2017.02.17 [2017codegate] BabyMISC
  9. 2017.02.12 [Reversing.kr] Easy Crack
  10. 2017.02.10 [xcz] Prob9_Easy Reversing
Reversing/Skill2017. 5. 13. 02:43

어셈블리 언어는 리버싱을 하기 위한 가장 기초 지식이다.

프로그래밍탭에 쓸까 이곳에 쓸까 고민많이 했는데, 깊게 들어가진 않을 거라 이곳에 쓴다.


레지스터

CPU에서 사용 하는 기억장소로, C언어로 빗대어 표현하자면 변수라고 봐도 무방하다.

이 곳에서는 80x86 프로세서를 기반으로 설명한다.


레지스터의 종류

데이터 레지스터

EAX, EBX, ECX, EDX


포인터 레지스터

ESP, EBP


인덱스 레지스터 (Index register)

ESI, EDI


세그먼트 레지스터 (Segment register)

CS, DS, SS, ES


명령어 구성

명령어 종류

push

push eax

eax의 값을 스택에 저장 

pop 

pop eax

스택의 값을꺼내 eax에 저장 

mov 

mov eax, ebx

ebx의 값을 eax에 옮김 

lea 

lea eax, ebx 

ebx의 주소값을 eax에 옮김

inc 

inc eax 

eax++ 

dec 

dec eax 

dec-- 

sub 

sub eax, ebx 

eax에서 ebx를 뺀 값을 eax에 저장

call 

call abc 

abc라는 함수를 호출 

ret 

ret 

호출한 바로 다음 지점으로 이도 

cmp 

cmp eax, ebx 

eax와 ebx값을 비교 (매우 자주 나옴) 

jmp 

jmp abc 

abc라는 곳으로 이동 

int 

int 3

인터럽트, 안티디버깅 기법중 하나로도 쓰임

nop 

nop 

아무 동작도 하지 않음 




'Reversing > Skill' 카테고리의 다른 글

[Shell coding] msfvenom 쉘코딩  (0) 2017.05.10
Posted by BadSchool
Reversing/Skill2017. 5. 10. 00:11

msfvenom


개요

msfvenom이란 kali linux에 기본 내장되어 있는 툴이다.

기존에는 msfpayload와 msfencode를 사용하였지만 2015년에 툴을 통합하며 msfvenom으로 다시태어났다.


사용법






msfvenom은 매우 편한툴이다. 하지만 툴에만 의존하게 된다면 실력이 저하될 수 있다.


다음엔 직접 쉘코드를 짜보는 것을 해보겠다.

'Reversing > Skill' 카테고리의 다른 글

[Assembly] 기본 명령어  (0) 2017.05.13
Posted by BadSchool
Reversing/WriteUp2017. 4. 30. 01:36

문제사이트 : Plaid CTF

문제이름 : zipper

링크 : X

 

풀이

↑문제파일

 

 

 

↑내가 만든 비교파일

 

zip파일이 깨진 문제파일이다. 구글의 zip header를 보며 정상적인 zip파일과 비교해보았다.

그랬더니 zip파일의 이름과 이름길이 헤더부분이 고장난 듯 보였다.

알맞게 고쳐서 입력하였더니 플래그를 얻을 수 있었다.

'Reversing > WriteUp' 카테고리의 다른 글

[2017codgate] RamG  (0) 2017.03.03
[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
Posted by BadSchool
Reversing/WriteUp2017. 3. 3. 02:19

문제사이트 : Codegate

문제이름 : RamG

링크 : X


풀이


↑프로그램을 실행하면 나오는 화면이다. 4를 누르면 히든메뉴가 나타나는데,

두개의 문자열을 입력받고 어떠한 과정을통해 c라는 파일 하나가 생성된다.



↑보다시피 c라는 파일은 뒤죽박죽이다. 일단 프로그램을 분석해보았다.



↑올리디버거를 켜기 전에 BinText로 쭉 훑어보았다.

그 중 상당히 수상해보이는 문자열들이 보였다. 개수도 같고 입력받는 부분 바로전에 쓰여있어

메모장에 적어두었다.



↑문제파일의 기능 중 두 문자열을 XOR해주는 기능이 있었다. 

아까 의심스러웠던 문자열을 시험삼아 해보다가 수상한 문자열 하나가 나왔다.

일단 이것도 메모장에 적어두었다.



↑본격적으로 분석하였다. 처음 문자열을 입력받은 후 진행되는 연산이다.

아까 수상하다고생각한 MVYLXYUARJ 와 474591474591을 xor하는 모습이 보였다.



↑그래서 RamG 기능으로 XOR해보았더니 yamyambugs라는 문자열이 나왔다.

이것이 첫번째 시크릿 코드이다.



↑스테이지 2로 넘어가려는 길목에 상당히 견고해보이는 안티디버깅 코드가 보였다.

레지스트리 변조나 점프문을 NOP으로 바꾸면 지나갈 수 있다.



↑두번째 스테이지에서는 cmp구문이 3개가 나온다.

덤프로 들어가서 맞게 변조해주면 지나갈 수 있다.



↑세번째 스테이지 에서는 레지스트리가 있는지와 그 내용을 점검하여 맞다면 hel을 저장한다.

hel을 저장할 수 있게 코드를 잘 수정해주면 된다.



↑4번째 스테이지는 2번째와 동일하게 진행하면 된다.



↑5번째 스테이지로 가는 길목에 안티디버깅이 있는데 전과 동일하게 넘어가면된다.

마지막은 1번째 스테이지 처럼 문자열을 비교하는데, 원리는 같고 예상한대로 의심되었던

hellowfish를 입력해주면 된다.



↑메모는 리버싱문제의 필수인듯 하다.


↑c파일이 생성되고 뒤에 확장자 .png를 붙이게 되면 플래그가 보인다.



이 문제는 유난히 운이 좋게 얻어걸린(?) 부분이 많았던 문제였다.

어렵긴 했지만 푸는과정이 재미있어서 좋은 문제라고 생각된다.



'Reversing > WriteUp' 카테고리의 다른 글

[Plaid CTF] zipper  (0) 2017.04.30
[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
Posted by BadSchool
Reversing/WriteUp2017. 2. 21. 23:21

문제사이트 : Reversing.kr

문제이름 : CSHARP

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행해 보니 딱봐도 내가 싫어하는 C#문제가 보인다. 내용은 간단하게 비밀번호를 알아내면 되는 문제이다. 이상하게도 구글에는 풀이가 거의다 잠겨있어서 나도 전체를 다 풀이하진 않을것이다. 그래도 도움이 많이 될 듯싶다.



↑분석을 위해 NET Reflector로 열어보았다. 몇몇 수상한 코드들이 보였지만 나는 C#을 잘모르기때문에 핵심만 찾아보았다. 그중 수상한 "MetMett"라는 함수가 보였는데 이상하게도 열리지않았다.




↑그러던 중 .ctor에서 수상한 코드를 발견했다. MetMett를 암, 복호화 시키는 듯한 코드였다.

검색을 해보니 ctor은 메인함수가 실행되기 전에 가장 먼저 실행되는 부분이라고 한다.

즉 프로그램을 실행하면 암호화되어있는 MetMett부분을 이 코드로 복호화시켜준다는 말이다.




↑IDA로 분석해 본 결과 이 부분들이 암호화된 MetMett 였다.

간단하게 C언어로 복호화코드를 만들었다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
void main(){
    int arr[] = { 0x020x8D0x680x1E0x0B0x3F0xDE0xFF0xFF0xFF0x010x150x170x9B0x020x150x900x1F0x8F0xFF0xFF0xFF0x600x1E,  0x490x2D0x030x010x150x160x9B0x020x180x900x1F0x8F0xFF0xFF0xFF0x600x1E0x450x2D0x030x010x150x160x9B0x020x160x900x1F0x8F0xFF0xFF0xFF,  0x600x1E0x560x2D0x030x010x150x160x9B0x020x170x900x1F0x8F0xFF0xFF0xFF0x600x1E0x4C0x2D0x030x010x150x160x9B0x020x1E0x0A0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x2B0x2D0x030x010x150x160x9B0x020x1D0x900x1F,  0x8F0xFF0xFF0xFF0x600x1F0xF00xFF0xFF0xFF0x2D0x030x010x150x160x9B0x020x190x900x1F0x8F0xFF0xFF0xFF0x600x1E0x1C0x2D0x030x010x150x16,  0x9B0x020x1A0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x300x2D0x030x010x150x160x9B0x020x1E0x080x900x1F0x8F0xFF0xFF0xFF0x600x1F0xE10xFF0xFF,  0xFF0x2D0x030x010x150x160x9B0x020x1C0x900x1F0x8F0xFF0xFF0xFF0x60,  0x1F0xED0xFF0xFF0xFF0x2D0x030x010x150x160x9B0x020x1E0x090x900x1F0x8F0xFF0xFF0xFF0x600x1F0xA20xFF0xFF0xFF0x2D0x030x010x150x160x9B,  0x020x1B0x900x1F0x8F0xFF0xFF0xFF0x600x1E0x740x2D0x030x010x150x16,  0x9B0x29 ,0x00 };
    int num = 0;
    int sum = 0;
 
    for (int i = 0; arr[i] != 0x00; i++)
    {      
        arr[i] += 1;
        arr[i] &= 0xFF;
        sum += arr[i];
        sum &= 0xFF;
        num++;
    }
 
    arr[18= (sum - 38& 0xFF;
    arr[35= (sum - 3& 0xFF;
    arr[52= (sum ^ 39& 0xFF;
    arr[69= (sum - 21& 0xFF;
    arr[87= (71 - sum) & 0xFF;
    arr[124= (sum ^ 114& 0xFF
    arr[141= (sum ^ 80& 0xFF
    arr[159= (235 - sum) & 0xFF;  
    arr[179= (106 + sum) & 0xFF;   
    arr[200= (36 - sum) & 0xFF;   
    arr[220= (sum - 3& 0xFF;
 
    for (int i = 0; i < num; i++)
              printf("%02X ", arr[i]);
}
 
cs

↑그 후 헥스에디터로 복호화 된 값을 패치하고 분석툴로 다시열어보자 MetMett 부분이 보였다.

자세한 사항들은 더 적지 않겠지만, 이곳이 비밀번호를 체크하는 부분이다.


이 코드를 분석하여 비밀번호를 알아내었다.


'Reversing > WriteUp' 카테고리의 다른 글

[Plaid CTF] zipper  (0) 2017.04.30
[2017codgate] RamG  (0) 2017.03.03
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
Posted by BadSchool
Reversing/WriteUp2017. 2. 21. 02:18

문제사이트 : Reversing.kr

문제이름 : Ransomware

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행 한 화면이다. 어떤 더덩넘이 파일을 암호화시키고 5천억 달러를 벌려고 한다. 정말 나쁜놈 인듯 싶다. Key를 입력하면 파일이 복구되지만 잘못되면 더 꼬인다고 한다.
일단 우리의 올리디버거로 확인을 해보자.

참고로 이 파일은 UPX로 패킹되어 있다. 어떤 문제던 풀기 전에 패킹여부 확인은 필수이다.



↑분석을 해보니 파란색으로 하이라이트 한 부분에서 내가 입력한 키값을 순서대로 한글자씩 불러오고, 암호화 된 파일의 바이너리값도 가져와서 XOR연산을 한 뒤 0xFF로 또한번 XOR연산 해준다.

즉 순서대로 보면 

파일 ^ 입력값 ^ 0xFF



↑여기서 중요한 힌트가 하나 있는데, 바로 암호화 된 파일이 EXE파일 이라는 것이다. 그뜻인 즉 파일헤더 부분이 보통 EXE파일과 같다는 것. 이를 통해 코드를 짜 볼 수 있다.



↑file 의 한줄과 일반exe파일의 한줄을 가져와서 코드를 짰다. 코드자체에서도 불러올 수 있겠지만 미숙한 관계로..


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
void main()
{
    int arr[] = { 0xDE ,0xC0 ,0x1B ,0x8C ,0x8C ,0x93 ,0x9E ,0x86 ,0x98 ,0x97 ,0x9A ,0x8C ,0x73 ,0x6C ,0x9A ,0x8B };
    int arr2[] = { 0x4D0x5A , 0x90 , 0x00 , 0x03 , 0x00 , 0x00 , 0x00 , 0x04 , 0x00 , 0x00 , 0x00 , 0xFF , 0xFF , 0x00 , 0x00 };
    int result[16= { NULL };
    int xor = 0;
    for (int i = 0; i < 16; i++)
        arr[i] = arr[i] ^ 0xFF;
 
    for (int i = 0; i < 16; i++)
    {
        for (int j = 1; ; j++)
        {
            xor = arr[i] ^ j;
            if (arr2[i] == xor)
            {
                printf("%c", j);
                break;
            }
        }
    }
    printf("\n");
}
cs

↑코드 실행 결과. letsplaychess까지 출력되고 다시 반복되는 듯 하다.



↑아까 구해낸 키값을 입력하여 복호화 시켰다.

참고로 복호화 된 exe파일도 UPX로 패킹되어 있다. 가볍게 언패킹 시키고 툴로보니 답이 바로 나왔다.



↑답 : Colle System.


'Reversing > WriteUp' 카테고리의 다른 글

[2017codgate] RamG  (0) 2017.03.03
[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
[Reversing.kr] Easy Crack  (0) 2017.02.12
Posted by BadSchool
Reversing/WriteUp2017. 2. 21. 00:51

문제사이트 : Reversing.kr

문제이름 : Replace

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행하고 Check 버튼을 누르면 나오는 화면

문제의 시작부터 상당히 불친절하다.ㅎㅎ


↑올리디버거로 보아하니 이 부분에서 오류가 난다. 아마도 EAX값과 같은 메모리 주소가 없어서 예외처리가 나는것으로 보인다. 90은 NOP인데, 아마도 correct로 가지 못하게 하는 코드부분의 주소값을 이 부분에서 NOP처리하게 만들면 정상실행이 될 것 같이 보인다. 

(correct로 가지 못하게 하는 점프문은 401071이다)



↑물론 이렇게 직접 EAX값을 수정해 주면 Correct를 볼 수 있다. 하지만 문제는 우리가 무슨값을 입력해야 Correct가 나오는지 알아야 하기 때문에 의미가 없다고 할 수 있다.



↑일단 우리가 입력한 값이 어떻게 변화하는지 보기위해 BP을 걸고 확인하여 보았다.

입력한 값은 4084D0 이라는 곳에 저장이 된다.



↑쭉 넘어가 보니 몇몇 연산들이 보였다.

대충 보자면 함수들을 호출하여 4084D0에 INC를 해주는 모습이다. 순서를 따져보자면

입력한 값 + 0x1 + 0x1 + 0x601605C7 + 0x1 + 0x1

으로 정리해 볼 수 있다.

즉 정리해 보자면

입력한값 + 0x601605CB = 0x401071 이다.

계산기 조금만 뚜드려 보면 답을 알 수 있다.


'Reversing > WriteUp' 카테고리의 다른 글

[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
[Reversing.kr] Easy Crack  (0) 2017.02.12
[xcz] Prob9_Easy Reversing  (0) 2017.02.10
Posted by BadSchool
Reversing/WriteUp2017. 2. 17. 17:41

문제사이트 : Codegate

문제이름 : BabyMISC

링크 : X


풀이


↑STAGE 1의 코드이다. 분석해보니 사용자에게 입력받는 값의 base64decode 값이

TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oig=의 디코드 값과 같아야 하며

입력한 값과 길이도 같아야 한다. 그런데 TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oig=과 입력한값이 같으면 안된다.

언듯 보았을 때는 모순적으로 보일수도 있다. 하지만 base64의 특성을 이용하여 마지막값만 하나 바꿔서 입력해주면 넘어간다.

입력 : TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oih=



↑끝자리만 h로 바꿔주자 다음 스테이지로 넘어갔다.



↑STAGE 2는 두번 값을 입력받는데, 그 두개의 입력값의 길이가 다르며 base64decode 값은 같아야 한다.

이 또한 모순적일 수 있으나 단지 두번째 값에 =을 하나더 붙여주면 넘어가는 스테이지 이다.



↑등호 하나만 더 입력해주자 넘어가 졌다.

입력 : TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oih=

TjBfbTRuX2M0bDFfYWc0aW5fWTNzdDNyZDR5Oih==



↑마지막으로 우리에게 단 하나의 명령어를 base64로 입력할 수 있는 기회를 준다. 하지만 분석해보면

[/|$|-|_|&|>|`|'|"|%|;]|(cat)|(flag)|(bin)|(sh)|(bash) 을 필터링 하고 있다.



↑ 필터링 하는 모습.


서버로 연결한 것이 아닌 파일을 실행해서 푸는거라 STAGE3을 푸는 사진은 캡처하지 못했다.


기억나는 대로 쓰자면 우선 ls -la를 base64코드로 입력하여 플래그 파일을 찾는다.


그리고 head * 명령어를 base64코드로 입력해 주면 플래그 파일이 출력되며 결과를 알 수 있다.


head 명령어는 파일의 내용을 위에서부터 10줄 출력해 내는 명령어 이다.



'Reversing > WriteUp' 카테고리의 다른 글

[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[Reversing.kr] Easy Crack  (0) 2017.02.12
[xcz] Prob9_Easy Reversing  (0) 2017.02.10
Posted by BadSchool
Reversing/WriteUp2017. 2. 12. 16:36

문제사이트 : Reversing.kr

문제이름 : Easy Crack

링크 : http://reversing.kr/challenge.php


풀이


↑프로그램을 실행하여 text목록을 보니 익숙한 멘트들이 보였다.

 

↑빨간부분에서 정답인지 아닌지 확인한다.

 

↑12345678을 입력하고 시작지점에 브레이크 포인트를 걸고 보니

파란색 CMP 부분에서 내가 입력한 2와 아스키코드 61을 비교하였다.

61은 a 이므로 두번째 글자는 a이다.

Pw = XaXXXXXXX

 

 

↑1a345678을 입력하고 더 내려가 보니 5y라는 문자열이 보인다.

스크린샷을 못찍었지만 밑의 call문에서 34와 5y를 비교한다.

pw = Xa5yXXXXXX

 

 

↑1a5y5678를 입력하고 내려가보니 아주 수상한 R3versing이라는 문자열이 보인다.

파란색의 밑에부분부터 보면 내가 입력한 5678문자열과 R3versing문자열을 반복문으로 비교한다.

따라서 뒷부분은 R3versing

pw = Xa5yR3versing

 

 

↑마지막으로 첫번째 글자만 알아내면 된다. 사진의 CMP부분을보면 내가입력한

1가 45를 비교한다. 45는 아스키코드표에서 E로 나오므로 첫번째 글자는 E이다.

 

 

↑따라서 비밀번호는 Ea5yR3versing


'Reversing > WriteUp' 카테고리의 다른 글

[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
[xcz] Prob9_Easy Reversing  (0) 2017.02.10
Posted by BadSchool
Reversing/WriteUp2017. 2. 10. 22:57

문제사이트 : XCZ

문제이름 : Prob9_Easy Reversing

링크 : http://xcz.kr/START/prob/prob9.php


풀이 :


↑REV.exe파일을 다운로드받아 ID에 1234, PW에 5678을 입력한 모습

우측 상단을 보면 내가 입력한 ID값인 1234와 "XCZ"라는 문자열을 비교하고있다.


↑이와같이 ID가 XCZ가 아닐 시에는 who are you???출력 부분으로 점프한다.

따라서 ID = XCZ

↑ID를 XCZ로 입력하고 쭉 넘어가보니 아까와 비슷한 상황이 나온다.

똑같이 생각하여 PW = UNL1M1T


↑실행 후 ID와 PW를 입력해주면 키값이 나온다.

'Reversing > WriteUp' 카테고리의 다른 글

[Reversing.kr] CSHARP  (0) 2017.02.21
[Reversing.kr] Ransomware  (0) 2017.02.21
[Reversing.kr] Replace  (0) 2017.02.21
[2017codegate] BabyMISC  (0) 2017.02.17
[Reversing.kr] Easy Crack  (0) 2017.02.12
Posted by BadSchool