Write-Up/FTZ(Write-Up)

    [FTZ] level20 (Write-Up)

    [FTZ] level20 (Write-Up)

    hint를 열어보자 bleh는 80만큼 입력을 받고 fgets로79만큼 입력을 받아서 BOF가 안일어난다. 다른것을 찾아보자... printf(bleh); 여기서 문제가 발생한다. 원래대로 printf("%s",bleh);라면 정상적으로 출력이 되겠지만 이렇게 할경우 bleh의 버퍼에 서식문자열을 입력하여 메모리 주소를 알아낼 수 있다. BOF를 RET를 통하여 문제를 해결했지만 FSB는 .dtors를 이용한다. .dtors는 프로그램을 종료할때 사용하는 소멸자이다. 0일경우에는 정상적으로 종료되지만 0이 아닌 다른값을 입력할경우 종료후 그 값을 실행한다. 이러한것을 이용하는것을 포스트링버그(FSB)라고 한다. AAAA를 입력할경우 4번째에서 우리가 원하는것이 나오므로 사이에 12Byte의 dummy가 ..

    [FTZ] level19 (Write-Up)

    캡쳐랑 복붙이 안돼서 글로만 쓰게되서 죄송합니다. hint를 열어본다면 main() { char buf[20]; gets(buf); printf("%s\n",buf); } 이번에도 쉘코드를 사용해야 할 것 같습니다. 하지만 setreuid함수가 없으므로 조금 다른 쉘코드를 사용하겠습니다. export EGG=`python -c 'print"\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"'` gdb를 통해서 buf의 위치를 확인합니다. ebp-40이라는 것을 알 수 있습니다. 그러므로 sfp의 크기를 포함하도록 하여 44바이트를 채워버리고 리턴주소를 아까 ..

    [FTZ] level18 (Write-Up)

    [FTZ] level18 (Write-Up)

    hint를 열어보자. 음.... 천천히 봐보자 string[100]을 선언하고 int형으로 check, x = 0, count = 0 이렇게 선언해 주었다. 그리고 낯선 함수들이 눈에 보인다. FD_ZERO :*fdset의 모든 비트를 지운다 FD_SET : *fdset 중 첫번쨰 인자 fd에 해당하는 비트를 1로한다. FD_CLR : *fdset 중 첫번째 인자 fd에 해당하는 비트를 0으로 한다. FD_ISSET : *fdest 중 첫번째 인자 fd에 해당하는 비트가 세트되어 있으면 양수값인 fd를 리턴한다. slelect : FD_SET으로 설정된 fd만을 확인한다. 그리고 read또는 write준비가 된 fd를 fdset내에서 세트 시킨다. count가 100이 넘으면출력이되고 count가 0xd..

    [FTZ] level17 (Write-Up)

    [FTZ] level17 (Write-Up)

    hint를 열어봤다 16번문제랑 생긴게 매우 비슷하다. 근데 Shell함수가 없으니 Shell code를 만들어서 printit에서 실행시키면 될것같다. 16번이랑 위치까지 똑같다. 그러면 면 환경변수로 쉘코드를 만들어보자 그다음에 쉘코드를 받도록 프로그램을 만들어보자 이런식으로 말이다. 실행을 시켜보이 주소가 0xbffffe40이라는것을 알 수 있다. 그러면 buf와printit의 거리가 40인것을 생각하고 페이로드를 짜보자 성공!

    [FTZ] level16 (Write-Up)

    [FTZ] level16 (Write-Up)

    hint를 풀어보자 이번에는 함수 포인터가 있다. call = printit이니까 Hello there!이 출력될것이다. buf는20인데 48만큼입력을 받는것을 이용하여 call을 했을때 쉘을 따도록 해보자 일단 gdb로 뜯어보자 이러하다 main+24에서 buf를 를 할당받고 main+6은 포인터함수를 할당받는거라고 추측한다. buf는 ebp-56-56이고 포인터 함수는 ebp-16이니까 거리는 40이다. 우리는 ebp-16에있는 함수를 shell함수로 바꿔야 하니까 shell함수의 시작주소를 봅시다. 0x080484d0이 시작주소인것을 확인할 수 있다. 그러면 포인터함수와 buf의 거리가 40인것을 이용해봅시다. 성공!

    [FTZ] level15 (Write-Up)

    [FTZ] level15 (Write-Up)

    hint를 한번 보자 14번 문제에서 check가 포인터 ㅇ:이수로 바뀌었다. check의 주소값을 deadbeef로 바꿔주면 된다. 일단 gdb로 뜯어보자. check를 main+32근처에서 검사를 하는것같다. 다시한번 gdb로 deadbeef를 찾아보자. 0x80484b2에 deadbeef가 있다. 그러면 이제 check에 복붙을 하면 될것 같다. 성공!

    [FTZ] level14 (Write-Up)

    [FTZ] level14 (Write-Up)

    hint를 한번 보자! check의 값이 0xdeadbeef이면 쉘을 띄운다 그렇다면 check의 값을 덮어 씌워주면 될것 같다. buf의 크기가 20이지만 45만큼 입력을 받는다. gdb로 뜯어보면 요렇게 되있다. buf와 check의 거리는 56-16이므로 40이다. 성공!

    [FTZ] level13 (Write-Up)

    [FTZ] level13 (Write-Up)

    hint를 보자! 입력한 값을 buf[1024]에 저장하고 i가 0x1234567가 아니면 프로그램이 죽는다.... 이 문제는 strcpy를 이용해서 시도해야 되는데 i를 잘 피해야 된다... 일단 gdb로 한번 봐보자! 을 보면 0x418(1048)만큼 할당을 하고 를 보면 0x1234567dmf [ebp-12]에 넣는것을 볼 수 있다. buf에는 1024만큼 할당되고 남은 24중에서[ebp-12]의 바로 윗 부분인 12는 dummy이다. [ebp-12]에 i의 값인 4이고 남은8은 dummy 그리고 SFP는 4이고 RET가 나온다. 그러면 buf랑 dummy를 A로 채우고 i는 0x1234567로 채우고 dummy랑 SFP를 A로 채운뒤 RET를 덮으면 될것이다. 일단 환경변수를 등록해주고 shell..