분류 전체보기
[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..
[ROP Emporium] callme
check - 64 bit - NX - Partial RELRO Analyze pseudo code - main()함수는 앞의 문제들과 같다 - 스택 버퍼 s에 0x20byte만큼 할당하고 read 함수를 통해 0x200byte만큼 입력받을 수 있도록 되어 있다. - callme_three(4,5,6), callme_two(4,5,6), callme_one(4,5,6)이라는 함수를 호출한다. rop_emporium hint callme_one(0xdeadbeefdeadbeef, 0xcafebabecafebabe, 0xd00df00dd00df00d) > callme_two(~~) > callme_three(~~) 순서로 rop chain을 만들어줘야한다. gadgets pop rdi ; pop rsi ; ..
HelloWorld.exe
◾ 실습환경: VisualStudio 2015, IDA pro 7.0 [C] HelloWorld.exe helloworld.c (Visual Studio) #include int main() { puts("hello world!\n"); return 0; } Visual Studio에서 위의 코드를 작성하고 64bit Release 버전으로 컴파일(빌드)했다. HelloWorld.exe (IDA) 앞의 단계와 같이 빌드하고나면 "프로젝트 폴더 > x64 > Release에 HelloWorld.exe" 실행파일이 생성된다. IDA pro 64bit에 해당 실행 파일(HelloWorld.exe)를 넣고 실행하면 아래와 같은 창을 볼 수 있다. Options > General > Disassembly > Nu..
[Protection Tech.] RELRO
RELRO (RELocation Read-Only) ELF 바이너리(프로세스)의 다이나믹 섹션에 읽기 권한만을 부여해 데이터 섹션의 보안을 강화하는 보호기술 * Lazy Binding 바이너리가 실행되는 도중 함수가 처음 호출될 때 주소를 찾는 방식 ELF 바이너리에서 동적 라이브러리의 함수를 호출할 때 호출된 함수를 찾기 위해 PLT와 GOT를 사용하는데 이 때 GOT가 사용되는 방식과 같다. PLT, GOT 정리▷▶doongdangdoongdangdong.tistory.com/117?category=869864 Lazy Binding을 하기 위해서는 프로그램이 실행되는 도중 GOT에 라이브러리 함수의 주소를 덮어써야 한다. 즉, GOT에 쓰기 권한이 있어야한다. ==> RELRO가 설정되어 있는 바이..
Instruction (명령어)
Instruction Format 명령어는 opcode + operand로 이뤄져있다. OPCode OPeRand Opcode(Operation Code) 명령 코드; 명령어에서 실제로 어떤 동작을 하는지 나타내는 부분이다. 명령코드(Opcode) 또는 기계코드(Machine Code) 바이너리를 구성하는 코드들로, CPU가 실제로 수행할 작업을 나타내는 숫자 코드다. 명령코드는 CPU의 종류별로 다른 값으로 표현될 수 있고, 명령코드의 종류에 따라 피연산자(operand)가 필요하기도 하다. 어셈블리 코드(Assembly Code) 숫자로 표현된 명령코드가 어떤 의미를 갖는지 이해하기 쉽도록 작성된(Mnemonic) 코드이다. 어셈블리어가 기계어와 1:1로 대응되 듯, 명령코드와 1:1로 대응된다. o..