Write-Up

    [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..

    [FTZ] level12 (Write-Up)

    [FTZ] level12 (Write-Up)

    hint를 열어보자! 이 코드는 사용자가 입력한 문자열을 똑같이 출력하는 코드이다. gets는 입력받는 문자열에 제한이 없기때문에 저기서 문제가 발생할것 같다. gdb로 한번 뜯어보자! 에서 esp에 0x108(264)만큼 공간을 할당해 주었고 그 밑에 에서 esp에 0x8(8)만큼의 dummy값이 들어가 있다. 그러면 264-8인 256이 str의 공간이고 8만큼의 dummy 그리고 4만큼의 spf를 지나서 4만큼의 ret이 나온다. 따라서 256+8+4 만큼인 268을 임의의 값을 채워주고 쉘 주소를 입력해서 ret값을 변조 시킬 수 있다. tmp로 가서 쉘코드를 환경변수에 등록한다. getenv함수를 이용하여EGG라는 환경변수의 주소 값을 가져오는 코드 작성 실행을 해보니 환경변수의 주솟값은 0xb..

    [FTZ] level11 (Write-Up)

    [FTZ] level11 (Write-Up)

    hint를 열어보자! str에 256만큼 저장을 받는데 입력에 제한이 없으니 256을 넘겨버리면 다른 메모리 공간을 건드리게 된다 그러면 setuid를 가지고있는 것이 무엇인지 보자 앗! 저기 attackme가 가지고 있었다.... gdb를 이용하여 어셈블리어로 한번 보자 0x08048473에 있는 sub 0x108 을 10진수로 바꾸면 264가 된다. 하지만 str은 256만큼 할당했는데 왜 그럴까? 바로 더미데이터 때문이다. 그러므로 더미데이터가 8이므로 264가 되게 된다. 다음에 실행할 명령어의 메모리 주소인 RET에 내가 실행하고자 하는 코드를 집어 넣을것이다. 이제 우리가 입력받는 곳을 넘겨서 RET까지 보내야 하니까 str 256 더미 8 SFP 4 이니까 268을 채운다음에 RET에 원하는..

    [FTZ] level10 (Write-Up)

    [FTZ] level10 (Write-Up)

    hint를 보자 여기서 key_t의값을 알려준것이 큰 힌트인것같다 일단 공유메모리가 무엇일까? 공유메모리는 여러 프로그램이 동시에 접근할 수 있는 메모리이다. shared Memory segments를 보면 key가 있는데 우리는 이ㅣkey는 알고있다. shmget([key값],[size],[perms]) 이렇게 집어넣었다. shmat를 이용해서 공유메모리 사용이 가능하게 하였다. 그리고 pA를 출력하였다. 이것을 컴파일 하면? 성공!

    [FTZ] level9 (Write-Up)

    [FTZ] level9 (Write-Up)

    hint를 보자 buf가 10인데 40만큼 입력을 받는다?! /usr/bin/bof를 실행시켜보자 아무렇게 하면 안되는거같다...... 다시한번 코드를보니 buf가10칸이고40만큼 입력받으니까 buf2에 닿을때까지 입력을 하면 될꺼같다 사이의 거리가 10이지만 dummy가있어서 얼마나 가야할지 모르겠다.... 힌트에 있는것을 vi로 만들고 어셈블리어로 바꾸어보니 40에서입력을 받고 24에서도 입력을 받으니까 거리가 16인것같다 그러므로 16칸뒤에go를 쓰면 될것같다. 이제 my-pass를 입력하고 끝내자 성공!