ROP 썸네일형 리스트형 [Dice CTF 2021] babyrop 0. Binary 분석 64bit 바이너리에 NX bit가 설정되어 있고, 그 외의 보안 기법은 설정되어 있지 않다. write( ) 함수로 "Your name: "을 출력하고, gets( ) 함수로 변수를 입력받고 프로그램이 종료되는 간단한 함수다. 1. 취약점 분석 gets( ) 함수에서, 변수에 길이제한 없이 입력받기 때문에 "버퍼 오버플로우" 취약점이 발생한다. 80글자의 문자열을 입력하면 RIP를 덮어서 흐름을 제어할 수 있다. 2. Exploit 작성 문제 이름처럼, ROP를 이용하면 될 것 같다. 취약점 자체는 쉬웠지만, 익스플로잇을 작성하는데 어려움을 겪었다. 일단 쉘을 획득하기 위해 write( ) 함수를 이용하여, write나 gets의 주소를 leak해서 system( )이나 exec.. 더보기 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 .. 더보기 이전 1 다음