분류 전체보기 82

[dreamhack] level 2 Return to Shellcode

문제 분석0x7ffc17ea9690와 같이 bof 주소가 출력되고 buf와 rbp까지의 거리를 알려준다.(buf에서 sfp거리) 그리고 사용자 입력을 두번 받는다. 위의 코드에서 read(0, buf, 0x100)과 gets(buf) 코드를 보면 스택 버퍼 오버플로우가 발생한다는 것을 알 수 있다. 스택 프레임 구조 파악위에서 획득한 정보는 buf부터 sfp까지의 거리는 0x60이고 buf에서 카나리까지의 거리는 0x60 - 0x08의 값인 0x58이 된다.buf에서 sfp까지의 거리와 buf에서 카나리까지의 거리를 구했으면, buf에서 카나리까지 쓰레기 값으로 채워주고 뒤에서 카나리를 출력하도록 하면 카나리 값을 획득할 수 있다.# [2] Leak canary valuepayload = b'A' * (..

[dreamhack] level 1 basic_exploitation_001

문제 분석AAA만 입력했을 때는 아무런 동작을 하지 않는다. 하지만 A를 엄청나게 많이 입력했을때는 Segmentation fault 에러가 뜨는 것을 확인할 수 있다. 따라서 core 파일이 생성되었다. core 파일 분석core 파일을 gdb로 분석해보면 0x61616161에서 violation이 발생하였다. 그리고 esp에 우리가 입력한 aaa의 값의 일부인 aaa가 저장되어 있는 것을 확인 할 수 있다. 따라서 너무 많은 값을 입력하여 반환 주소를 aaa가 덮어쓴 것이다. basic_exploitation_001.c 코드 분석해당 파일의 코드를 보면 read_flag라는 함수에서 cat을 이용하여 flag를 읽고 있는 것을 확인 할 수 있다. 또한 buf라는 버퍼에는 0x80만큼의 공간이 있다. ..

[dreamhack] level 2 basic_exploitation_000

문제 분석buf = ( 뒤에 랜덤한 주소가 출력되고 AAAAA를 입력하면 아무런 동작을 하지 않는다. 따라서 AAAA를 엄청나게 많이 입력해보았더니 Segmentation fault 에러가 뜨는 것을 확인할 수 있다. basic_exploitation_000.c 파일 확인#include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1);}void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30);}int main(..

[dreamhack] Return Address Overwrite

문제 분석해당 문제에 AAAAA 라고 입력해보면 아무 동작도 하지 않는다. 하지만 A를 64개 정도 입력해보면 Segmentation falut라는 에러가 뜨고 core 파일이 위와 같이 생성된다.  코어 파일 분석gdb로 core 파일을 확인해보면 버퍼오버플로우로 인해 버퍼의 크기를 초과하여 반환 주소를 0x4141414141로 덮어쓴것 같다. 따라서 return address를 변조하면 될 것 같다.rao 파일 분석스택 프레임 구조를 파악하기 위해 rao를 분석해보니 위와 같은 어셈블리 코드를 확인할수 있었다.사용자의 입력이 들어갈 버퍼의 위치는 rbp-0x30이다. 이후에는 sfp가 저장되고 rbp+0x8엔 ret address가 저장된다.  따라서 버퍼의 위치와 반환 주소 사이에는 0x38만큼의 ..

[dreamhack] Beginner shell_basic

문제파일을 실행하면 위와 같은 결과를 얻을수 있다. shellcode를 통해 flag를 찾아야 한다. 문제 분석shell_basic.c 파일을 보면 main 함수에서 banned_execve() 함수가 있는 것으로 보아 execve 셸코드를 통한 공격은 막아 놓은 것 같다. 따라서 orw 셸코드를 작성하여 공격을 해보자 익스플로잇위와 같이 orw 셸코드를 작성해주었다. 문제에서 flag 파일의 위치와 이름은 "/home/shell_basic/flag_name_is_loooooong" 라고 했으니, /home/shell_basic/flag_name_is_loooooong을 리틀 앤디언으로 변환해주고 orw 셸코드를 셸코드 강의에서 배웠던 것과 똑같이 작성해주었다. 그리고 작성한 셸코드를 opcode 형태로..

[dreamhack] level2 ez_rev

해당 파일을  실행하면 특정 값을 입력할수 있고, 입력을 마치면 KKKK라는 문자열이 출력된다.  IDA 분석main 함수를 디컴파일 하면 위와 같은 코드를 확인할수 있다. 1. 사용자에게 입력을 받고 입력받은 값을 _0에 저장2. 사용자의 입력값을 특정 연산을 통해 변환함3. v12의 문자열과 비교4. (!v8 && !v9) == v8  조건을 만족하면 Correct 출력 ida에서 off_4E50F0의 값을 확인하면 "qksrkqs"가 저장되어 있는 것을 확인할수 있다. 사용자가 입력한 값을 변환한 값이 "|l|GHyRrsfwxmsIrietznhIhj"와 일치해야 한다.따라서 변환된 값이 |l|GHyRrsfwxmsIrietznhIhj가 되려면 어떤 값을 입력해야하는지 알아내야한다. 따라서 flag를 ..

[dreamhack] level 1 Check Function Argument

main 함수를 디컴파일 하면 위와 같은 코드가 나온다. 문구를 살펴보니 puts문 아래의 함수의 파라미터에 flag가 존재하는듯하다. 따라서 해당 함수의 주소에 bp를 걸고 gdb를 통해 디버깅을 시도해봤다. sub_4015E2 함수 주소 : 0x00000000004015E2 b *0x00000000004015E2 위의 실행 결과에서 알 수 있듯이Flag is DH{63db030352ca9f9f5e6b8a59c0527bee}'이렇게 flag가 출력되는 것을 확인할 수 있다.

[dreamhack] level1 Small Counter

해당 바이너리를 실행하면 위와 같은 숫자들이 출력된다. IDA 분석위의 코드를 확인해보면 [rbp+var4]의 값이 5와 같아야 "Nice!"라는 문구를 출력한다. 따라서 [rbp+var4]의 값이 5와 같아지도록 gdb를 활용하여 수정해야한다. pwndbg 디버깅일단 cmp [rbp+var4], 5가 있는 주소로 이동해야 한다. ida에서 해당 주소를 확인해보면 0x00000000000015AA인것을 알 수 있다.디버깅을 하기 앞서서 checksec 명령어를 통해 PIE 여부를 확인해보면 PIE가 enabled 되어 있는 것을 확인할 수 있다.따라서 vmmap을 통해 해당 바이너리의 시작점을 확인한다. 따라서 0x00000000000015AA + 0x555555554000를 연산한 주소에 bp를 걸어준..