둥당둥당동
[CodeEngn] BASIC RCE L01
◾ 실행환경: IDA pro(32bit) 코드를 수정해 HD를 CD-Rom이라고 생각하는 메시지가 출력될 수 있도록 한다. (원본 캡쳐본들이 날아갔다..) 수정한 부분은 loc401021에서 가장 마지막 점프 브랜치 명령이다. 원본 코드에서는 eax, esi 값을 비교하고 je short loc_40103D였다. 바로 위 cmp 명령코드부분에 breakpoint를 걸고 실행해보면, 이렇게 eax 레지스터와 esi 레지스터의 값이 다르다. 이 때 두 가지 방법이 있는데, breakpoint를 걸고 실행 중 eax 레지스터의 값, 혹은 esi 레지스터의 값을 변조하여 서로 같게 만들어 je 조건에 통과해 loc_40103D를 실행할 수 있도록 한다. eax, esi 레지스터의 값을 변조하지 않을 경우, 결과..
[HackCTF] Handray
Analyze 64bit ELF assembly code 하이라이팅한 부분이 현재 프로그램을 실행시켰을 때, 프로그램의 흐름대로 실행되는 코드들이다. 하지만 우리가 원하는 부분은 이 부분으로, 에서의 jne 0x40058d에 의해 실행되지 않고 지나간다. 그렇다면 어떻게 jne에서 점프되지 않고 그 아래 코드인 '0x400544~0x400586'을 실행시킬 수 있을까? 답은 jne 의 바로 위 조건을 확인해야한다. 에서 cmp [rbp-0x4], 0으로 rbp-0x4의 값이 0인지 비교하고 있다. 이 때, rbp-0x4의 값이 0이 되어야 jne에서 점프하지 않을 수 있다. 따라서, 에 breakpoint를 걸고 rbp-0x4의 값을 0으로 바꿔 실행한다.
[HackCTF] Reversing Me
Source Code #include #include int main() { int i; char *serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}"; char enter[54]; printf("키를 입력하시게 : "); scanf("%s", enter); if (strlen(enter) == strlen(serial)) { for (i = 0; i < strlen(serial) && (enter[i] ^ (i % 2)) == serial[i]; i++); if (i - 1 == strlen(enter)) printf("정답일세!\n"); } else printf("그건 아닐세...\n"); exit(0); } serial값과 사용자가..
[HackCTF] welcome_rev
check 32bit ELF Analyze pseudo code (IDA) ./welcomerev [password] 의 꼴로 프로그램을 실행하도록 되어있다. 이 때 check_password 함수에서 사용자가 입력한 password와 실제 flag를 비교한다는 것을 확인할 수 있다. check_password함수 내에서 strncmp함수를 통해 "SGFja0NURnt3M2xjMG0zXzcwX3IzdjNyNTFuNl93MHJsZEBfQCFfIX0"와 사용자가 입력한 값(s1)을 n byte만큼 비교하는 것을 확인할 수 있다. 📌 끝에 =이이 붙어있는 경우, base64로 encoding 되어있음을 추측할 수 있다! [디코딩/인코딩 사이트] https://dencode.com/
[HackCTF] Register
check Partial RELRO >> GOT overwrite 가능 Canray NX 64 bit Analyze main()함수 alaram함수를 호출하고 build()함수를 호출한다. unsigned int alarm (unsigned int secs); seconds 초 후에 프로세스에 SIGALARM(14)을 전달한다. SIGALARM의 기본행동은 프로세스 종료이다. build()함수 #(build)13 void (*signal(int signum, void (*handler)(int)))(int); 시그널 처리 함수로, 특정 시그널(signum)이 발생했을 때, 어떻게 처리를 할 것인지 시그널 핸들러를 직접 지정해주는 함 sigum: 각 시그널별로 지정된 숫자(순번) handler: 시그널을 ..
[ROP Emporium] write4 (재)
Check - Partial RELRO --> got 덮어 쓸 수 있음 - NX Analyze pseudo code (IDA pro) main 함수에서 라이브러리 함수인 pwnme()를 호출한다. 0x20 byte만큼 할당한 스택 버퍼 s에 read함수를 통해 0x200 byte까지 입력받을 수 있도록 하면서 버퍼 오버플로우 취약점이 발생한다. 라이브러리 함수인 print_file을 호출해 "nonexistent"라는 인자를 전달하고 있다. >> 여기서 "nonexistent"의 값을 flag.txt로 바꿔서 플래그를 출력할 수 있도록 해야할 것 같다!! gadgets pop rdi ; ret ; = 0x400693 printf_file함수를 호출하는 영역: 0x400620 그 아래를 살펴보니 usefu..
[HackCTF] Unexploitable_1
check - 64bit - NX Analyze pseudo code (IDA) - 0x10byte만큼 할당된 스택 변수(문자열) s에 fgets함수를 이용해 64byte (= 0x40 byte)만큼 입력받는다. 이 때 버퍼오버플로우가 발생할 수 있다. - main함수의 내용을 보면 system@plt를 이미 가지고 있다고 한다. 그래서 IDA를 통해 좀 더 살펴보면 이런 함수가 있고 이 가젯을 사용하라고 한다. 어셈블리 코드로 다시 확인해보면 "call system" 가젯을 사용할 수 있는게 아닌가 싶다. - "call system" : 0x4006d4 gadgets Exploit (1) from pwn import * #context.log_level = 'debug' #p = process("./U..
어셈블리 코드 변환
주어진 어셈블리 코드들은 모두 AT&T 문법으로 작성되어 있다. 이전에 정리했던 instructions는 intel 문법에 따른 어셈블리 코드들로, AT&T 문법에서는 intel 문법과 달리 오른쪽 operand에 값이 저장된다. 1번 .file "example1.c" .section .rodata .LC0: .string "Hello world" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq %rsp, %rbp .cfi_def_cfa_register 6 movl $.LC0, %edi movl $0, %eax call print..