본문 바로가기

전체 글

HITCON Training lab10 (first fit, uaf) First fit? 메모리 할당 알고리즘 중 하나로 First-fit 뿐만 아니라 Best-fit, Worst-fit이 있다. Best Fit은 사용가능한 메모리를 찾고, 그 중 가장 작은 메모리에 할당한다. Worst Fit은 사용가능한 메모리를 찾고, 그 중 가장 큰 메모리에 할당한다. First Fit은 사용가능한 메모리에서 가장 처음 발견한 곳에 할당하는 것을 의미한다. How2Heap, First #include #include #include int main() { fprintf(stderr, "This file doesn't demonstrate an attack, but shows the nature of glibc's allocator.\n"); fprintf(stderr, "glibc .. 더보기
HITCON Training lab7 ~ 9 Lab7 #include #include #include #include unsigned int password ; int main(){ setvbuf(stdout,0,2,0); char buf[100]; char input[16]; int fd ; srand(time(NULL)); fd = open("/dev/urandom",0); read(fd,&password,4); printf("What your name ? "); read(0,buf,99); printf("Hello ,"); printf(buf); printf("Your password :"); read(0,input,15); if(atoi(input) != password){ puts("Goodbyte"); }else{ puts("Congrt.. 더보기
BOF 중 scanf에 대한 글 DreamHack에 워게임 문제들을 처음부터 풀어보고 있는데 막힌 부분이 있어서 블로그에 정리한다. NX같은 보호기법도 안걸려있는 전형적인 버퍼오버플로우 취약점의 문제였다. 간단히 페이로드를 [Nop Sled] [Shellcode] [SFP] [RET = Buf's addr] 로 구성하여 exploit을 했다. 처음에는 peda에서 제공해주는 쉘코드를 사용했는데 스택에 쉘코드가 제대로 박히지 않았다. 디버깅을 해봤는데, System Call을 위해 eax를 11(=0xb)로 셋팅하려고 사용한 "push 0xb" 명령어의 기계어인 "6a 0b" 중 "0x0b"가 누락되었다. 테스트해보니깐 입력을 받는 함수인 scanf에서 0xb를 입력값으로 받아들이지 못하고 입력이 종료되버린다. ASCII 코드표를 보면,.. 더보기
HITCON Training lab6 lab6 #include int count = 1337 ; int main(){ if(count != 1337) _exit(1); count++; char buf[40]; setvbuf(stdout,0,2,0); puts("Try your best :"); read(0,buf,64); return ; } 간단한 소스코드다. buf[40] 변수가 있는데 read 함수를 통해 64 길이만큼 입력받아서 BOF 취약점이 발생한다. ROP를 통해 쉘을 획득하려고 했는데 64 크기만큼만 입력할 수 있다는 것이 문제가 생겼다. 일단, puts의 got를 통해 실제 함수를 구하고 offset 계산을 통해 system 함수를 구하는 것까지 했다. 하지만 길이의 제한으로 더 이상 입력할 수 없어서 .bss 영역을 fake.. 더보기
HITCON Training lab4 ~ 5 lab4 #include void See_something(unsigned int addr){ int *address ; address = (int *)addr ; printf("The content of the address : %p\n",*address); }; void Print_message(char *mesg){ char buf[48]; strcpy(buf,mesg); printf("Your message is : %s",buf); } int main(){ char address[10] ; char message[256]; unsigned int addr ; puts("###############################"); puts("Do you know return to library .. 더보기
CodeUp 기초100제 (바둑알 십자뒤집기) 19 x 19 바둑알이 깔려있는 상황과 십자뒤집기할 기준좌표를 입력으로 주어진다. 이를 십자뒤집기하면 되는 문제이다. 처음에 십자뒤집기 개념을 잘 몰랐는데 주어진 기준좌표는 뒤집지않고 십자모양으로 뒤집으면 된다. #include #define N 21 int main(){ int arr[N][N]={0,}; int a,x,y; for(int i=1;i 더보기
Oneshot 가젯 One-gadget? 라이브러리 파일 내에서 "/bin/sh"를 실행하는 가젯 대부분 CTF에서 GOT 영역을 덮어쓸 수 있을 경우 사용 One Gadget 찾기 strings, objdump를 통해 구하기 one_gadget 사용 문제풀이 (TJCTF 2016 oneshot) 바이너리 분석 결과, 원하는 주소를 읽어 해당 값을 구할 수 있고 원하는 주소로 점프할 수 있다. 아마 파일명과 같이 Oneshot gadget을 이용하여 문제를 해결하라는 것 같다. 나는 puts의 got를 읽어 함수주소를 구하고 이를 통해 원샷가젯의 주소를 구해 문제를 해결할 계획이었다. 문제를 해결하며 삽질했던 부분은 다음과 같다. Libc Base 주소 구하기 gdb를 통해 파악한 메모리 매핑 중 라이브러리의 Start A.. 더보기
HITCON Training lab1 ~ 3 Lab1 #include #include void get_flag(){ int fd ; int password; int magic ; char key[] = "Do_you_know_why_my_teammate_Orange_is_so_angry???"; char cipher[] = {7, 59, 25, 2, 11, 16, 61, 30, 9, 8, 18, 45, 40, 89, 10, 0, 30, 22, 0, 4, 85, 22, 8, 31, 7, 1, 9, 0, 126, 28, 62, 10, 30, 11, 107, 4, 66, 60, 44, 91, 49, 85, 2, 30, 33, 16, 76, 30, 66}; fd = open("/dev/urandom",0); read(fd,&password,4); prin.. 더보기