본문 바로가기

BOF

해커스쿨 Level17 Hackershcool level17 = ) 해커스쿨 FTZ 레벨17 [BOF] #include void printit() { printf("Hello there!\n"); } main() { int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); setreuid(3098,3098); call(); } 17번 문제의 소스를 보면 fgets에 취약점이 존재하고 setreuid로 권한상승이 이뤄지고 있다. 0x080484a8 :push%ebp 0x080484a9 :mov%esp,%ebp 0x080484ab :sub$0x38,%esp 0x080484ae :movl$0x8048490,0xfffffff0(%ebp) 0x080484b5 :sub$0.. 더보기
해커스쿨 Level16 Hackershcool level16 = ) 해커스쿨 FTZ 레벨16 [BOF] 코드를 살펴보면 일단 쉘을 실행하는 함수와 printit이라는 함수가 있고 크기가 20인 배열과 취약점이 있는 fgets함수가 있다. 프로그램을 실행시켜보니 깔끔하게 printit함수를 출력시키고 끝나버린다. 하지만 printit함수가 아닌 shell함수의 주소가 들어간다면 쉘이 떨어지게 될 것이다. 메인함수에서는 아까와 같이 56byte의 공간을 할당해주고 있으며 ebp-16지점에서 eax에 값을 넣는 것을 볼 수 있는데 eax의 값에서 어떤 함수를 call해주고 있는 것을 볼 수 있다. 어떤 함수인지 알아보기 위해 main+39에 브레이크포인트를 걸고 eax의 값을 확인해보았다. eax의 값은 0x8048500 주소에 있.. 더보기
해커스쿨 Level15 Hackershcool level15 = ) 해커스쿨 FTZ 레벨15 [BOF] 15번 문제는 14번 문제와 비슷하지만 check 변수에서 포인터를 이용하고 있다는 점이 다르다. 전체적으로는 14번문제와 비슷하지만 포인터를 사용하고 있기 때문에 이번에는 0xdeadbeef란 문자열 대신 0xdeadbeef를 가리키는 주소를 넣어주면 된다. 버퍼 중간에 deadbeef란 문자열을 넣어주고 ebp-16부분에 이 문자열을 가리키는 주소를 넣으면 되는것이다. main+32에서 브레이크 포인트를 걸고 입력한 값들이 어디에 저장되는지 찾아보니 0xbffffae0에 값이 들어가는 것을 알 수 있다. 이 부분에 deadbeef라는 값이 들어가게 되고 ebp-16되는 지점에서는 이 부분을 가리켜주면 되는 것이다. 문제 .. 더보기
해커스쿨 Level14 Hackershcool level14 = ) 해커스쿨 FTZ 레벨14 [BOF] 이번에는 fgets함수로 글자수 길이를 45바이트로 제한하고 있지만 buf배열의 크기가 20이므로 BOF가 발생할 수 있다. 그리고 check변수의 값이 0xdeadbeef라는 값이 들어가야 setreuid와 쉘이 뜨게 되어있다. 바로 쉘을 얻을 수 있으니 에그쉘 없이 BOF만을 이용해 check에 deadbeef라는 문자열을 넣어야 한다는 것을 추측할 수 있다. main한 번 살펴보면 ①번 밑줄에서 56byte만큼 공간을 할당해주고 있고 ②번 밑줄에서 ebp-16만큼의 공간에서 문자열 비교를 해주고 있다. 그렇다면 쓰레기값 ‘40byte+비교문자열’이면 쉘이 뜰거라는 것을 알 수 있다. 인자 전달 방식은 이전의 Level1.. 더보기
해커스쿨 Level13 Hackershcool level13 = ) 해커스쿨 FTZ 레벨13 [BOF] 이번 문제는 11, 12번과 역시 같은 구조이지만 변수 i의 값이 0x1234567이 아니라면 메시지 출력 후 프로그램이 종료되어버리는 특징이 있다. 따라서 이번에는 변수 i 부분에는 01234567이라는 값을 넣어주고 나머지 부분은 dummy로 오버플로우 시켜서 ret값에 도달하면 된다. 버퍼1 + \x67\x45\x23\x01 + 버퍼2 + ebp + Ret 과 같은 구조로 코드를 구성해야하기 때문에 변수 i까지의 거리를 구해야한다. 0x080484a0 : push %ebp 0x080484a1 : mov %esp,%ebp 0x080484a3 : sub $0x418,%esp 0x080484a9 : movl $0x123456.. 더보기
해커스쿨 Level12 Hackershcool level12 = ) 해커스쿨 FTZ 레벨12 [BOF] Level 12문제도 Level11처럼 hint를 보면 setreuid함수와 gets함수로 문자열을 입력받는 것을 볼 수 있다. 12번 문제도 11번처럼 gdb로 disas main해본 결과 다음과 같았다. ①을 보면 11번 문제와 마찬가지로 스택에 16진수로 108만큼 공간을 할당 해주는 것을 볼 수 있다. 역시 10진수로 바꾸면 264바이트가 된다. 이후는 11번 문제와 같이 264바이트 + ebp 4바이트 = 268바이트를 쓰레기 값으로 채워주고 Return Address를 에그쉘의 주소로 넘겨주면 된다. 따라서 이전과 같이 공격을 해보았다. 공격한 방법이 효과가 없었으며 11번과 달리 gets로 입력받으므로 인자 전달.. 더보기
에그쉘 소스(Eggshell code) 에그쉘(Eggshell)이란 딱 봐도 계랸껍질이라는 말이지만 BOF에서는 버퍼의 크기가 쉘코드의 크기보다 작아서 쉘코드를 써넣을 수 없을 때 환경변수에 쉘을 등록해놓고 그 주소값만 가져와서 쉘을 띄울 수 있게 해주는 프로그램이다. 하지만 에그쉘은 환경변수에 등록 후 등록된 주소의 값을 불러오는 프로그램(getegg)을 작성 해야 제대로 쓸 수 있다. 에그쉘 코드 작성 후 한번 실행하여 "EGG"라는 이름으로 쉘코드를 환경변수에 넣어줘야 getegg로 Eggshell의 주소를 가져올 수 있다. 주의할 점 : 에그쉘 소스를 바로 vi 편집기에 붙여넣으려고하면 깨진 상태에서 붙여넣기가 되고 컴파일도 제대로 되지 않는다. 붙여넣기 전에 :set paste 로 설정을 바꿔줘야 제대로 붙여넣기가 되고 컴파일 시에도.. 더보기
해커스쿨 Level11 Hackershcool level11 = ) 해커스쿨 FTZ 레벨11 [BOF] Level 11로 로그인을 한 뒤 파일 목록을 보니 attackme라는 파일에 level12의 setuid가 걸려있는 것을 확인하고 hint파일을 열어보니 attackme의 소스를 확인할 수 있다. setuid가 걸려있는 파일이 실행 중인 상태에서는 해당 파일의 소유자의 권한이 주어지므로 이를 이용해 level12의 쉘을 실행시킬 수 있다. gdb를 이용하여 attackme 파일의 main함수 부분을 disassemble 해보면 다음과 같은 구조라는 것을 알 수 있다. ①번 코드를 살펴보면 ESP에 16진수로 108크기 만큼 Buffer 영역을 확보해주고 있다. 16진수 108은 10진수로 264이다. 버퍼의 크기는 264바.. 더보기