분류 전체보기 78

Return Oriented Programming / GOT overwrite

ROP?다수의 리턴 가젯을 연결해서 사용하는 공격기법.ret 단위로 여러 코드가 연쇄적으로 실행되는 모습이라 ROP chain이라고도 불림. ASLR이 걸린 환경에서 system 함수를 사용하려면 프로세스에서 libc가 매핑된 주소를 찾고,그 주소로부터 system함수의 오프셋을 이용하여 함수의 주소를 계산해야한다. 이전 실습인 Return to library 공격과 차이점이 뭐임system함수를 호출하지 않아 PLT에 없음. -> 해결방법? system함수 주소를 직접 찾기/bin/sh 문자열을 데이터섹션에 저장하지 않음. -> 직접넣기? 모르겠음.  실습- ROP를 이용한 GOT Overwrite으로 익스플로잇.보호기법 탐지ASLR 적용되어 있고, 바이너리엔 카나리와 NX가 적용됨. 시스템함수 주소 ..

[Dreamhack] baby-bof

DescriptionSimple pwnable 101 challengeQ. What is Return Address?Q. Explain that why BOF is dangerous.    보호기법 코드 분석 win()함수분석win함수를 실행하면 flag값을 읽어온다. main()함수분석이 부분에서는  name+idx*8을 사용해 메모리를 조작할 수 있음.name을 시작 주소로 해서, 8바이트 간격으로 이동하며value를 count번 메모리에 써 넣는 반복문이다.즉, ebp 부터 ret주소 전까지 name+idx*8 이 값을 이용해 공간을 채워야한다. idx주소 범위설명count 값 0일 때 아무 것도 안 씀1일 때 name[0~7]에 value 씀2일 때 na..

[Dreamhack] Return to Library

Return To LibraryNX 보호로 인해 스택에 주입한 셸코드를 직접 실행할 수 없게 되자, 공격자들은 이미 실행 권한이 있는 메모리 영역을 활용하는 방법을 생각해냈다.라이브러리 중에서도 다양한 함수가 구현된게 있는데, 예를 들면 리눅스에서 C언어로 작성된 프로그램이 참조하는 libc에는 system, execve 같은 프로세스 실행과 관련된 함수들이 있다.공격자들은 libc의 함수들로 NX를 우회하고 셸을 획득하는 return to library 공격기법을 개발함. 리턴 가젯이란?$ ROPgadget --binary rtlGadgets information============================================================...0x00000000004005..

C언어 포인터 개념

포인터?메모리의 주소를 가지고 있는 변수 변수와 메모리변수의 크기에 따라 차지하는 메모리 공간이 달라진다char형 변수는 1바이트 차지int형 변수는 4바이트 차지float형 변수는 4바이트 차지 주소연산자 &C언어에서 변수의 주소를 계산하는 연산자변수의 이름을 받아서 변수의 주소를 반환함. 포인터 선언변수의 주소를 가지고 있는 변수포인터 변수라는 말을 쓰는데포인터 이름은 식별자 규칙을 따름. 배열의 이름 = 배열의 시작주소 = 포인터 상수 int *p --> p주소로 가면 int(정수)값이 들어가있음char *pc -->  pc주소로 가면 char(문자열)값이 ㅇ들어가 있음int i = 10; // 정수형 변수 i 선언int *p, // 포인터 변수 p 선언p = &i; // 변수 i의 주소가 포인터 ..

Static Link vs Dynamic Link / PLT vs GOT

라이브러리?컴퓨터 시스템에서, 프로그램들이 함수나 변수를 공유해 사용 가능하게 한다.라이브러리를 사용하면 같은 함수를 반복적으로 정의해야 하는 수고를 덜 수 있음.#표준 라이브러리 경로$ ld --verbose | grep SEARCH_DIR | tr -s ' ;' '\n' 링크?라이브러리 함수를 사용할 때 호출된 함수와 실제 라이브러리의 함수가 링크 과정에서 연결됨.컴파일의 마지막 단계이다. 심볼과 관련된 정보들을 찾아서 최종 실행 파일에 기록하기도한다. *오브젝트 파일: 실행 가능한 형식을 갖추고 있지만, 라이브러리 함수들의 정의가 어디있는지 알지 못해 실행은 불하능한 파일. $ gcc -c hello-world.c -o hello-world.o]$ readelf -s hello-world.o | g..

NX 와 ASLR

NXNX(No-execute)는 실행에 사용되는 메모리 영역과 쓰기에 사용되는 메모리 영역을 분리하는 보호 기법.일반적으로 코드 영역에는 읽기와 실행, 나머지 영역에는 읽기와 쓰기 권한 부여. intel - XD(excute disable)windows - DEP(Data Execution Prevention)ARM - XN(excute Never)명칭이 다 다르지만 비슷한 보호기법임. ASLRASLR(Address Space Layout Randomization)은 바이너리가 실행될 때마다 스택 , 힙, 공유 라이브러리 등을 임의의 주소에 할당하는 보호 기법임. 메모리를 무작위 주소에 할당해서 보호한다. 최신 커널에는 대부분 적용되어 있는데 리눅스에서는 페이지 단위로 할당이 이루어져 하위12비트는 변하..

[Dreamhakck] ssp_001

Description이 문제는 작동하고 있는 서비스(ssp_001)의 바이너리와 소스코드가 주어집니다.프로그램의 취약점을 찾고 SSP 방어 기법을 우회하여 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요."flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.플래그의 형식은 DH{...} 입니다.소스코드 분석 및 보호기법 탐지#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(..

카나리(canary)개념/ 카나리 우회 실습[Dreamhack] Return to shellcode

실습 후궁금?buf 뒤에는 8바이트는 널값? 어디서난거 0x50이엇는데, -> 쓰레기값이 채워져있을 수 있어서 확실한 크기를 확인해보고 익스플로잇을 실행해야함.그리고 이 버프, 카나리, SFP는 항상 이 순서인지?-> 항상 이 순서가 맞음 buf -> canary -> SFP -> RET 순서.카나리값은 랜덤? 코드로 한번에 카나리값을 넣어서 익스플로잇을 바로 실행되게 해야하는건지? -> 카나리값은 랜덤임. 그래서 카나리값을 얻은 후 바로 값을 가져와 익스플로잇에 사용해야함.SFP = RBP ? 두개 정확한 차이 모르겟슴-> SFP는 이전 RBP 값을 저장하는 역할을 함. SFP는 현재 함수의 RBP와 같지는 않지만, 이전 함수의 RBP를 저장한 값임.익스플로잇 코드 못짜겠슴-> 짤 수 있게 연습해야함...

[Dreamhack] basic_exploitation_001

Description이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_001)의 바이너리와 소스 코드가 주어집니다.프로그램의 취약점을 찾고 익스플로잇해 "flag" 파일을 읽으세요."flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.플래그의 형식은 DH{...} 입니다.소스코드 분석 main()함수를 보면 gets(buf)함수가 존재한다.gets()함수는 입력 크기 제한이 있어서 버퍼 오버플로우에 아주 취약한 함수임.buf 크기는 0x80으로 128바이트임.128바이트보다 더 긴 입력을 해서 리턴 주소를 덮어쓰면 될듯하다. BOF 발생 가능 포인트 read_flag()는 메인함수에서 실행을 안하고 있는데, 이걸 실행시키면 cat flag가 실행돼서 fl..

[Dreamhack] basic_exploitation_000

Description이 문제는 서버에서 작동하고 있는 서비스(basic_exploitation_000)의 바이너리와 소스 코드가 주어집니다.프로그램의 취약점을 찾고 익스플로잇해 셸을 획득한 후, "flag" 파일을 읽으세요."flag" 파일의 내용을 워게임 사이트에 인증하면 점수를 획득할 수 있습니다.플래그의 형식은 DH{...} 입니다.소스코드 분석 먼저 main()함수를 살펴보면buf 크기는 0x80(128바이트)이지만 scanf("%141s", buf)를 사용해 최대 141바이트를 입력받을 수 있다.buf의 크기보다 더 많은 데이터를 입력받을 수 있어서 오버 플로우 발생이 가능하다. initialize()함수를 보면alarm(30);을 호출해서 30초 후에 SIGALRM 시그널이 발생하도록 설정돼있..