FTZ level15 문제 확인 level14와 다른점은, level14는 'check==0xdeadbeef' 로 check 변수의 주소값을 체크하는 것이었다면 level15는 check 변수의 주소값이 아닌 값이 0xdeadbeef 인지를 체크하고 있다. 즉, 0xdeadbeef를 메모리에서 찾은 후 그 주소값을 check 포인터 변수에 덮어써야하는 것이다. FTZ level15 문제 풀이 메모리는 이미 0xdeadbeef가 올라와있기 때문에 main 함수 내에서 주소를 찾아주면 된다. 또한, disas main으로 main함수의 어셈블리를 보면 dummy값을 알 수 있다. fgets의 첫번째 인자가 buf이므로 buf 주소는 0xffffffc8이고 그 밑에 cmp문의 0xfffffff0이 check ..
FTZ level14 문제 확인 취약점이 있는 fgets 함수를 이용해 bof를 수행하는 문제인데 check가 0xdeadbeef일 때, system 함수를 사용해 쉘을 실행시키고 있기 때문에 쉘코드를 쓰거나 RET까지 덮어줄 필요는 없어보인다. FTZ level14 문제 풀이 dummy를 잘 알아내는 것이 관건인 것 같은데 다 알아낼 필요는 없이 buf와 check 사이의 dummy 크기만 알아내면 된다. buf (str) : 20바이트 (0x14) dummy : ? buf (check) : 4바이트 dummy : ? buf (crap) : 4바이트 dummy : ? SFP : 4바이트 RET : 4바이트 사실 dummy 크기를 알아낼 필요도 없다. buf 뒤에 check 부분만 0xdeadbeef면 ..
FTZ level13 문제 확인 strcpy 함수가 사용되고 있는 것은 level11과 똑같아 보이는데 i 변수에 0x1234567을 저장해놓고 이 값이 변하면 동작하지 않도록 프로세스를 kill하고 있다. 즉, 0x1234567은 스택이 다른 값들로 덮어써지는 것을 막기 위한 일종의 스택가드라고 볼 수 있다. FTZ level14 문제 풀이 gdb로 실행시켜보면, 'sub 0x418, esp'에서 1048(0x418)-1024-4=20 이므로 i와 buf와 함께 dummy가 20바이트 (0x14) 존재하는 것을 알 수 있다. 하지만 dummy가 정확히 어디 위치하는지를 알아야 정확한 위치에 0x1234567을 써줄 수가 있다. strcpy 함수 호출 뒷부분에 bp를 걸어준 후 버퍼시작 주소를 대략 확인..
FTZ level12 문제 확인 level11과 마찬가지로 attackme 바이너리에 들어있는 gets 취약점을 사용해서 bof로 쉘을 획득해야하는 문제이다. FTZ level12 문제 풀이 gdb로 실행시켜보면, gets 함수를 호출하는 부분을 쉽게 확인 가능하다. 또한, str 버퍼는 256바이트를 할당해주었는데 'sub esp,0x108' 부분에서 dummy가 8바이트임을 알 수 있다. gets 함수 호출 뒤인 에 bp를 건 후 실행시켜 스택을 확인해본다. 0xbfffedd0 에 입력해준 A 값들을 확인할 수 있다. 하지만, 이번 문제도 어차피 랜덤스택(ASLR)이기 때문에 버퍼 주소는 계속 바뀐다. 일단 스택 상황은 아래와 같다. buffer (str) : 256바이트 (0x100) dummy :..
y2017년에 옛날 블로그에 작성했던 FTZ 풀이를 level11부터 옮깁니다. FTZ level11 문제 확인 FTZ Level11 부터는 bof로 풀 수 있는 문제들이 나온다. 디렉토리에 있는 파일들을 먼저 살펴보면, attackme라는 취약점이 존재하는 바이너리가 있고 setuid가 걸려있는 것으로 보인다. 그리고 hint 파일이 있는데 attackme의 소스코드인 것 같고 살펴보면 bof에 취약한 strcpy 함수를 사용하고 있다. char형 배열 str은 256 크기를 갖고 있는데 strcpy로 길이체크가 수행되지 않은 argv[1]을 str로 복사하고 있으니 버퍼오버플로우 취약점을 갖고 있는 것을 쉽게 확인할 수 있다. 여기서 한가지 알고 넘어가야 할 것은, 해당 바이너리의 취약점을 실행해서 ..
예전에 작성했던 글을 현재 블로그로 옮긴 것이라, 최신 버전이 아니니 각 버전은 현재 읽는 분들의 상황에 맞게 변경해주시면 될 것 같습니다. (캡쳐 사진은 다시 해보고 새로 캡쳐했습니다) AFL(American Fuzzy Lop)은 테스트 케이스의 코드 적용 범위(Code Coverage)를 효율적으로 늘리기 위해 유전자 알고리즘(Genetic Algorihm)을 사용하는 퍼저이다. 원래는 리눅스에서 돌릴 생각이었고 옛날에도 몇번 돌린적이 있어서 별 걱정을 안했는데, GUI 어플리케이션을 퍼징하는 것이 불가능한 듯 했다. qemu mode로 해야해서 간단한 뷰어 프로그램을 대상으로 12시간 이상을 켜놓았는데 실행이 계속 멈춰있었다. (GUI가 아닌 다른 어플리케이션은 잘됐다.) 어쨌든, 본인은 파일뷰어를..