본문 바로가기

전체 글267

[어셈블리어 분석 실습] example 4 example4.asm의 코드는 아래와 같다. # example4.asm .file"example4.c" .section.rodata .LC0: .string"result : %d\n" .text .globlfunction .typefunction, @function function: .LFB0: .cfi_startproc pushq%rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq%rsp, %rbp .cfi_def_cfa_register 6 subq$16, %rsp movl%edi, -4(%rbp) movl%esi, -8(%rbp) movl-4(%rbp), %eax imull-8(%rbp), %eax movl%eax, %esi movl$.LC0, %edi mov.. 2022. 5. 8.
[어셈블리어 분석 실습] example 3 example3.asm의 코드는 아래와 같다. # example3.asm .file"example3.c" .section.rodata .LC0: .string"a is 10" .LC1: .string"b is 10" .LC2: .string"b is 20" .LC3: .string"a=b" .LC4: .string"a!=b" .text .globlmain .typemain, @function main: .LFB0: .cfi_startproc pushq%rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq%rsp, %rbp .cfi_def_cfa_register 6 subq$16, %rsp movl$10, -8(%rbp) movl$20, -4(%rbp) cmpl$10,.. 2022. 5. 8.
[어셈블리어 분석 실습] example 2 example2.asm의 코드는 아래와 같다. # example2.asm .file"example2.c" .section.rodata .LC0: .string"result : %d \n" .text .globlmain .typemain, @function main: .LFB0: .cfi_startproc pushq%rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 movq%rsp, %rbp .cfi_def_cfa_register 6 subq$16, %rsp movl$10, -12(%rbp) movl$20, -8(%rbp) movl-8(%rbp), %eax movl-12(%rbp), %edx addl%edx, %eax movl%eax, -4(%rbp) movl-8(%rbp).. 2022. 5. 8.
[어셈블리어 분석 실습] example 1 example1.asm의 코드는 아래와 같다. # example1.asm .file"example1.c" .section.rodata .LC0: .string"Hello world" .text .globlmain .typemain, @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 callprintf movl$0, %eax popq%rbp .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .sizemain, .-main .ident"GCC: (Ubun.. 2022. 5. 8.
[어셈블리어 분석 실습] 기본 내용 이번 실습에서 어셈블리어는 AT&T 문법을 바탕으로 되어 있다. 기본적인 내용은 아래와 같으니 참고하자. .file "example1.c" # 디버거에서 사용하는 원본 파일 이름을 가리킴 (Intel 문법이 아니기 때문에 오른쪽 값을 왼쪽으로 넣음!!) .section .rodata # ./rodatd 섹션 정의, 이 섹션은 읽기 전용 데이터 변수 .text # text section. 코드들을장한 섹션/프로그램 코드 실행할 때 사용 .globl main # 전 코드에 걸쳐 접근 가능한 함수 .type main, @function # main 함수 정의. 이것을 해야만 global main 코드 얻을 수 있음 main: # main:~ret까지가 실제 코드 .LFB0: # 함수의 시작을 의미하는 'loc.. 2022. 5. 8.
[pwnable.kr] Toddler's Bottle - cmd2 이번에는 cmd1 문제를 이어 cmd2 문제를 풀어보았다. 대충 system command shell을 샀는데 필터 때문에 갖고 놀지 못한다는 것 같다. 이번에도 필터링 관련한 문제인 것 같다. 문제에 적혀있는 명령어로 접속해준다. 접속 완료했다. 파일 리스트는 이 정도 있다는 것을 확인한 뒤 cat으로 cmd2.c 내용을 살펴보았다. 먼저 main 함수를 살펴보았다. int main(int argc, char* argv[], char** envp){ delete_env(); putenv("PATH=/no_command_execution_until_you_become_a_hacker"); if(filter(argv[1])) return 0; printf("%s\n", argv[1]); system( ar.. 2022. 5. 7.
[pwnable.kr] Toddler's Bottle - cmd1 이번에는 cmd1 문제를 풀어보았다. 문제를 읽어보니 리눅스에서 PATH enviornment가 뭐냐고 묻고 있다. 아마도 이번 문제는 이와 관련한 문제인 것 같다. 아래에 적혀있는 명령어로 접속해준다. 접속 완료했다. 파일 리스트는 이 정도 있다는 것을 확인한 뒤 cmd1.c 파일의 내용을 살펴봤다. 먼저 main 함수를 살펴보았다. int main(int argc, char* argv[], char** envp){ putenv("PATH=/thankyouverymuch"); if(filter(argv[1])) return 0; system( argv[1] ); return 0; } 먼저, 낯선 함수 putenv를 살펴보았다. putenv는 환경변수의 내용을 수정하거나 추가하는데 사용된다. key=va.. 2022. 5. 7.
[pwnable.kr] Toddler's Bottle - bof 이번에는 bof 문제를 풀어보았다. 문제를 읽어보니 버퍼 오버플로우가 가장 흔한 소프트웨어 취약점이라고만 한다. 버퍼 오버플로우와 관련이 있는 문제라는 것만 알고 넘어가자. 문제에 있는 다운로드 링크를 통해, 바이너리와 c파일을 받아준다. 아래에 있는 nc 명령어는 나중에 거기로 접속해서 플래그를 획득하면 되니 일단은 넘어가자. 다운 받은 c파일을 열어 코드를 확인해보았다. #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme);// smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah.... 2022. 5. 7.
[Dreamhack Reverse Engineering] STAGE 4 [x86 Assembly] 1. 어셈블리 언어 1) 어셈블리 언어 - 컴퓨터의 기계어와 치환되는 언어 - CPU에 사용되는 ISA의 종류만큼 많은 수의 어셈블리어가 존재 ex. x64에는 x64의 어셈블리어 존재 2. x64 어셈블리 언어 1) 기본 구조 - 명령어 + 피연산자로 구성 - 명령어 : 동사에 해당 - 피연산자 : 목적어에 해당 - 예시 2) 명령어 데이터 이동 mov, lea 산술 연산 inc, dec, add, sub 논리 연산 and, or, xor, not 비교 cmp, test 분기 jmp, je, jg 스택 push, pop 프로시저 call, ret, leave 시스템 콜 syscall 3) 피연산자 - 상수, 레지스터, 메모리 - 메모리 피연산자는 []으로 둘러싸인 것으로 표현.. 2022. 5. 6.