카테고리 없음

[Dreamhack] 비기너 - 리버싱

후추멍멍이 2023. 12. 8. 11:19
드림핵 비기너 과정 수강 중, 리버싱 수준 점검 체크리스트에 대한 학습을 위한 기록자료 입니다. 
해당 게시글은 지속적으로 수정 및 편집될 예정입니다. 
// Figure 1. 예시 C 코드

#include <stdio.h>

int enc[17] = {75, 104, 111, 111, 114, 35, 71, 117, 104, 100, 112, 107, 100, 102, 110, 36, 3};

int main(){
    int key = 0;
    int dec[17];

    for(int i=0; i<17; i++){
        printf("%c", enc[i]);
    }

    printf("\nYour input: ");
    scanf("%d", &key);

    for(int i=0; i<17; i++){
        dec[i] = enc[i] - key;
        printf("%c", dec[i]);
    }
    printf("\n");

    return 0;
}
// Figure 2. 예시 assembly 코드

Dump of assembler code for function main:
   0x00005555555551a9 <+0>:     endbr64 
   0x00005555555551ad <+4>:     push   rbp
   0x00005555555551ae <+5>:     mov    rbp,rsp
   0x00005555555551b1 <+8>:     sub    rsp,0x60
   0x00005555555551b5 <+12>:    mov    rax,QWORD PTR fs:0x28
   0x00005555555551be <+21>:    mov    QWORD PTR [rbp-0x8],rax
   0x00005555555551c2 <+25>:    xor    eax,eax
   0x00005555555551c4 <+27>:    mov    DWORD PTR [rbp-0x5c],0x0
   0x00005555555551cb <+34>:    mov    DWORD PTR [rbp-0x58],0x0
   0x00005555555551d2 <+41>:    jmp    0x5555555551f6 <main+77>
   0x00005555555551d4 <+43>:    mov    eax,DWORD PTR [rbp-0x58]
   0x00005555555551d7 <+46>:    cdqe   
   0x00005555555551d9 <+48>:    lea    rdx,[rax*4+0x0]
   0x00005555555551e1 <+56>:    lea    rax,[rip+0x2e38]        # 0x555555558020 <enc>
   0x00005555555551e8 <+63>:    mov    eax,DWORD PTR [rdx+rax*1]
   0x00005555555551eb <+66>:    mov    edi,eax
   0x00005555555551ed <+68>:    call   0x555555555080 <putchar@plt>
   0x00005555555551f2 <+73>:    add    DWORD PTR [rbp-0x58],0x1
   0x00005555555551f6 <+77>:    cmp    DWORD PTR [rbp-0x58],0x10
   0x00005555555551fa <+81>:    jle    0x5555555551d4 <main+43>
   0x00005555555551fc <+83>:    lea    rax,[rip+0xe01]        # 0x555555556004
   0x0000555555555203 <+90>:    mov    rdi,rax
   0x0000555555555206 <+93>:    mov    eax,0x0
   0x000055555555520b <+98>:    call   0x5555555550a0 <printf@plt>
   0x0000555555555210 <+103>:   lea    rax,[rbp-0x5c]
   0x0000555555555214 <+107>:   mov    rsi,rax
   0x0000555555555217 <+110>:   lea    rax,[rip+0xdf4]        # 0x555555556012
   0x000055555555521e <+117>:   mov    rdi,rax
   0x0000555555555221 <+120>:   mov    eax,0x0
   0x0000555555555226 <+125>:   call   0x5555555550b0 <__isoc99_scanf@plt>
   0x000055555555522b <+130>:   mov    DWORD PTR [rbp-0x54],0x0
   0x0000555555555232 <+137>:   jmp    0x55555555526f <main+198>
   0x0000555555555234 <+139>:   mov    eax,DWORD PTR [rbp-0x54]
   0x0000555555555237 <+142>:   cdqe   
   0x0000555555555239 <+144>:   lea    rdx,[rax*4+0x0]
   0x0000555555555241 <+152>:   lea    rax,[rip+0x2dd8]        # 0x555555558020 <enc>
   0x0000555555555248 <+159>:   mov    eax,DWORD PTR [rdx+rax*1]
   0x000055555555524b <+162>:   mov    ecx,DWORD PTR [rbp-0x5c]
   0x000055555555524e <+165>:   sub    eax,ecx
   0x0000555555555250 <+167>:   mov    edx,eax
   0x0000555555555252 <+169>:   mov    eax,DWORD PTR [rbp-0x54]
   0x0000555555555255 <+172>:   cdqe   
   0x0000555555555257 <+174>:   mov    DWORD PTR [rbp+rax*4-0x50],edx
   0x000055555555525b <+178>:   mov    eax,DWORD PTR [rbp-0x54]
   0x000055555555525e <+181>:   cdqe   
   0x0000555555555260 <+183>:   mov    eax,DWORD PTR [rbp+rax*4-0x50]
   0x0000555555555264 <+187>:   mov    edi,eax
   0x0000555555555266 <+189>:   call   0x555555555080 <putchar@plt>
   0x000055555555526b <+194>:   add    DWORD PTR [rbp-0x54],0x1
   0x000055555555526f <+198>:   cmp    DWORD PTR [rbp-0x54],0x10
   0x0000555555555273 <+202>:   jle    0x555555555234 <main+139>
   0x0000555555555275 <+204>:   mov    edi,0xa
   0x000055555555527a <+209>:   call   0x555555555080 <putchar@plt>
   0x000055555555527f <+214>:   mov    eax,0x0
   0x0000555555555284 <+219>:   mov    rdx,QWORD PTR [rbp-0x8]
   0x0000555555555288 <+223>:   sub    rdx,QWORD PTR fs:0x28
   0x0000555555555291 <+232>:   je     0x555555555298 <main+239>
   0x0000555555555293 <+234>:   call   0x555555555090 <__stack_chk_fail@plt>
   0x0000555555555298 <+239>:   leave  
   0x0000555555555299 <+240>:   ret    
End of assembler dump.
  • 프로그램이 실행 되었을 때 프로그램이 어떠한 동작을 하는지 설명하세요
  • c 코드의 enc[17] 와 key 가 메모리에 배치될 때 각각 어떠한 메모리 세그먼트에 위치할지 대략적으로 설명하세요
  • 메모리와 레지스터의 차이를 설명하세요
  • 명령어 집합 구조(Instruction Set Architecture, ISA)가 무엇인지 설명하세요
  • c 코드가 어떠한 과정을 거쳐 컴파일 되는지, 그리고 컴파일 과정에서 코드가 어떻게 바뀌는지 설명하세요
  • c, 어셈블리, 바이너리 코드 각각의 특징과 그 차이점에 대해 설명하세요
  • 어셈블리 코드를 보고 main 함수의 stack frame 구조에 대해서 설명하세요
  • 어셈블리 코드를 보고 메모리와 레지스터를 구분하여 설명하세요
  • 어셈블리를 보고 동일한 기능을 하는 C 코드를 작성하세요
  • c 코드에서 int형 배열이 문자로 출력될 수 있는 이유를 설명하세요
  • “Hello dreamhack!” 을 출력하도록 하는 key 값을 구하세요
    •