분류 전체보기

    리버싱을 위한 기초 지식(구조)

    프로그램 실행 구조 컴퓨터의 기본 구조: CPU(processor) + Memory(메모리) + HDD(하드디스크) PE 포맷으로 구성된 실행파일을 클릭하면 운영체제에 있던 로더(loader)가 PE 헤더에 있는 정보를 분석해 PE 보디에 있는 코드와 데이터를 메모리에 배치하면서 프로그램이 실행된다. CPU (Central Processing Unit) 중앙 처리 장치; 기계어로 쓰여진 컴퓨터 프로그램의 명령어를 해석하고 실행하는 컴퓨터의 부분(하드웨어/칩)이다. 레지스터 (Register) : 컴퓨터의 프로세서(CPU) 내에서 자료를 보관하는 저장공간으로, 보통 현재 계산을 수행 중인 값을 저장하는 데 사용한다 산술 논리 연산 장치 (ALU; Arithmetic Logic Unit) : 산술 연산과 논..

    [dreamhack] 리버싱 엔지니어링이란

    Static Analysis VS Dynamic Analysis static analysis 프로그램을 실행시키지 않은 상태에서 분석하는 정적 분석 방법 ▶ 실행 파일을 구성하는 모든 요소, 대상 실행 파일이 실제로 동작할 CPU 아키텍쳐에 해당하는 어셈블리 코드에 대한 이해가 필요하다. dynamic analysis 프로그램을 실행시키며 입출력과 내부 동작 단계를 살피며 분석하는 동적 분석 방법 ▶실행 단게별로 자세한 동작 과정을 관찰해야 하므로, 환경에 맞는 디버거를 이용한 단계별 분석 기술이 필요하다. 코드의 Compile 과정 Source Code → Binary Code source code: 사람이 이해할 수 있는 코드 binary (code): 컴퓨터가 이해할 수 있는 형태인 프로그램 (코드..

    [ROP Emporium] split32

    check - 32bit - NX Analyze pseudo code는 앞에서 풀었던 split 과 동일하다. 문자열 s의 크기가 0x28byte로 할당되어있다!! - "/bin/cat flag.txt" 문자열은 data 영역인 0x804a030에 있다. - call system 코드의 주소는 0x804861a이다. gadget >> 따로 가젯을 호출할 필요가 없다 Exploit payload: BUF[0x28] + SFP[4] + SYSTEM(call system: 0x804861a) + BINSH(usefulString: 0x804a030) from pwn import * #context.log_level = 'debug' p = process("./split32") elf = ELF("./split..

    [RopEmporium] split

    check - 64bit - NX Analyze pseduo code (IDA) - 0x20 byte인 스택버퍼 s에 read함수를 통해 0x60byte만큼 입력받는 부분에서 버퍼오버플로우 취약점이 발생한다. >> 이 때 함수 리스트에 보이는 'usefulFunction'으로 리턴하면 될 것 같다. - 하지만, 이번에는 system("/bin/ls");로, 우리가 필요한 것은 "/bin/cat flag.txt"이다. IDA에서 [Shift]+[F12]를 누르면 아래와 같이 바이너리 내에 저장되어 있는 문자열들의 리스트를 보여준다. - "/bin/cat flag.txt"(usefulString)가 있다. usefulFunction에서 system함수의 인자로 호출되는 0x40084a: /bin/ls 를 덮..

    2021_1학기_시스템해킹_계획(21기)

    주차 과제 1주차 (3/22 - 3/28) * VMWare Workstation + Ubuntu 16.04 * IDA Pro 7.0 설치 - IDA Pro 사용법 정리 * pwndbg 설치 (gdb-peda 아닙니다!) 파일 디버깅할 때 이렇게 떠야 제대로 설치된 겁니다! * pwntools 설치 pwntools 사이트(설치 및 docs) : http://docs.pwntools.com/en/stable/ - [dreamhack] pwntools 사용법 (9강 Tools 중) 직접 실행하고 정리 * vim 설치 * checksec 설치 설치 방법 정리: doongdangdoongdangdong.tistory.com/92?category=869860 2주차 (3/29 - 4/4) - [Lazenca] Re..

    [ROP Emporium] ret2win

    check - 64bit - NX만 걸려있음 Analyze pseudo code (IDA) - 친절하게 힌트도 준다: read(0, &s, 0x38)에 대한 설명문으로, 0x20byte 크기의 스택 버퍼 s에 56byte를 입력한다는 점과 read()함수를 사용하기 때문에 NULL 바이트에 대해 걱정할 필요가 없다는 메시지이다. - 위 힌트에서 다 알려줬듯이 0x20byte만큼 할당된 스택버퍼 s에 그 이상의 값을 read함수를 통해 입력받기 때문에 BOF 취약점이 발생한다. - 함수목록을 살펴보면 ret2win이라는 함수가 있다. 이 함수는 system("/bin/cat flag.txt")를 호출하므로 이 함수로 이어지게 ROP chain을 만들면 될 것 같다. Exploit payload: BUF[0..

    [SWEA] 1933. 간단한 N 의 약수

    문제 문제의 제목 그대로 입력받은 정수 N의 약수를 모두 출력하는 문제이다 입력: 정수 N (1~1,000 >> int 형으로 가능) 출력: 정수 N의 모든 약수 풀이 import java.util.Scanner; import java.io.FileInputStream; class Solution { public static void main(String args[]) throws Exception { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); for(int i=1;i

    [HackCTF] Pwning (재)

    check - 32bit - Partial RELRO >> .got.plt 영역을 덮어쓸 수 있다 - NX Analyze pseudo code - atoi 함수를 이용해 문자 nptr값을 정수 v2로 바꾼다. - [get_n 호출 1] get_n 함수의 매개변수 a2에 4를 인자로 전달한다. get_n 함수의 반복문을 총 5번 반복하며 v4에 5개의 값을 입력받을 수 있다. - [get_n 호출 2] get_n 함수에 nptr주소값과 v2를 인자로 전달한다. get_n 함수의 반복문을 총 v2번 반복하며 v4에 v2개의 값을 입력받을 수 있다. >> get_n의 두 번째 인자로 v2를 전달할 때 v2이 데이터형은 int 형이지만, 매개변수 a2의 타입은 unsigned int이다. 즉, 음수를 입력하게 ..

    [HackCTF] Gift

    check - 32bit - NX Analyze psuedo code - binsh 문자열의 주소와 system 함수의 주소를 출력한다. - 128byte만큼 사용자로부터 fgets함수를 통해 입력받고 입력받은 내용을 출력한다. - printf(&s)에서 포맷스트링을 직접 출력인자로 넣으면서 FSB 취약점이 발생한다. - 0x84byte만큼 할당되어 있는 스택 버퍼 s에 gets를 통해 길이 제한없이 값을 입력받으면서 BOF 취약점이 발생한다. - 변수 binsh는 bss 영역에 정의된 초기화되지 않은 변수이다. 즉 binsh 변수에 "/bin/sh\x00"을 저장하여 사용할 수 있을 듯 하다. + bss 영역이기 때문에 ASLR이 적용되어 있어도 주소값이 달라지지 않는다. 실행 - 변수 binsh와 s..

    [SWEA] 2027. 대각선 출력하기

    문제 문제 화면에 나온 출력화면과 같이 대각선에 #이 출력되도록 한다. 입력: 없음 출력: 대각선에 #, 나머지는 + 풀이 import java.util.Scanner; import java.io.FileInputStream; class Solution { public static void main(String args[]) throws Exception { for(int i=0;i