표튜터와 함께하는 Pwnable/FTZ Write-up (11~20)
-
FTZ 19번 Write-up표튜터와 함께하는 Pwnable/FTZ Write-up (11~20) 2019. 2. 6. 14:51
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. FTZ 19번이다.아주 심플한 코드가 보인다.이전 문제들처럼 아주 쉽게 풀리겠다고 생각했다.19번인데 갑자기 난이도가 떨어진줄 알았다. ret까지 44개다.일단은 eggshell을 이용해서 ret를 덮어보았으나.. 오잉?? 분명히 제대로 실행된거같은데 권한이 올라가지 않았다... 음 아마도 권한상승기능이 없는 것 같다.다른 블로그들의 글을 찾아보니 일정 버전 이후, 보안상의 이유로그냥 쉘을 실행하면 권한상승기능이 제거되었다고 한다. 참고 : https://py0zz1.tistory.com/30 그래서 생각해보니 권한을 상승시키는 함수와"/bin/sh", 그리고 이 "/bin/sh"을 실행시켜줄system() 함수를 이용하여 RTL Chaninig을..
-
FTZ 18번 Write-up표튜터와 함께하는 Pwnable/FTZ Write-up (11~20) 2019. 2. 6. 13:17
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. FTZ 18번이다~코드를 보면 check값이 0xdeadbeef가 되면 shellout()함수가 실행되면서다음 권한으로 "/bin/sh"이 실행된다. 하지만 입력받는 양이 100보다 크거나 같으면 "What are you trying to do?"가 나오게 된다ㅎㅎ 이 문제를 풀기 위해서는 switch문에 있는 0x08을 이용해야하는데그 이유는 우선 스택에 어떤식으로 변수들이 쌓이는지 봐야한다. 일단 어셈블리어로 코드를 보자.우선 C로된 코드와 어셈블리어 코드를 비교해보았다.(굳이 어셈블리어 코드를 안봐도 스택은 그릴 수 있지만 그래도..ㅎㅎ)그랬더니 아래와 같이 스택이 쌓인다는 것을 알 수 있었다. C코드와 마찬가지로x가 먼저 0으로 초기화되고다..
-
FTZ 17번 Write-up표튜터와 함께하는 Pwnable/FTZ Write-up (11~20) 2019. 2. 5. 18:33
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. FTZ 17번이다.코드를 보니 16번과 비슷한데 shell()함수가 없다.fgets() 다음 setreuid로 다음 권한을 주는 것을 보니printit()함수 대신 "/bin/sh"이 실행되는 주소를 넘겨주면 될 것 같다.일단 printit()의 위치를 찾아보았다. 이전 문제와 같은 방법으로 찾으면 된다 역시 fgets()으로도 주소를 건드릴 수 있는 길이이다. 40개!!하지만 위에서말한대로 "/bin/sh"을 shell()같은 함수가 보이지 않는다. 그럼으로 eggshell을 이용하면 된다. 그 다음 printit()대신 eggshell의 주소를 씌워주면call실행 시 printit()대신 eggshell의 주소가 넘겨짐으로 다음단계로 갈 수 있다~
-
FTZ 16번 Write-up표튜터와 함께하는 Pwnable/FTZ Write-up (11~20) 2019. 2. 5. 18:22
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. FTZ 16번 문제이다. 코드를보자!코드를 보면 변수 선언 뒤 call이라는 포인터에 printit함수의 주소가 저장된다.그리고나서 fgets으로 버퍼에 값을 받고 call()함수가 호출되면printit()이 실행되는 구조이다. main()함수에서 쓰이지 않은 함수가 있는데바로 shell()함수이다.이 함수의 내용을 보니 한단계 위의 권한으로 "/bin/sh"을 실행시킨다.이 함수를 이용하여 다음 단계로 갈 수 있다는 것을 알았다.어셈블리어 코드를 보면 어떠한 주소값을 ebp-16에 넣고 있었고저기까지 프로그램을 실행시킨 뒤, 저 값이 의미하는 것이 무엇인지 확인했다.(printit()라고 짐작하고 있었다) 역시 저 값은 printit()를 의미했..
-
FTZ 15번 Write-up표튜터와 함께하는 Pwnable/FTZ Write-up (11~20) 2019. 2. 5. 08:09
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. FTZ 15번이다. 마치 FTZ 14번과 비슷하다고 느꼈겠지만 조금 다르다. 코드를 보면 이번에는 check가 포인터로 되어있다.나머지는 같고 비교문은 check의 주소와 비교하고 있다는 점이 14번과 다르다.역시 if문을 참으로 통과하게되면 다음권한으로 "/bin/sh"이 실행되어다음단계로 갈 수 있게 되는 구조이다. 어셈블리어 코드를 보자.fgets로 값을 받고나서 ebp-16에 있는 값을 eax에 저장한 뒤eax에 있는 4byte를 0xdeadbeef와 비교하는 코드였다. 0xbfffd718에 eax값이 저장된다는 것을 알았고fgets가 45까지지만 우리는 44개의 바이트만을 사용하기 때문에 상관이 없었다. 하지만 여기서 주의할 점은 [eax..
-
FTZ 14번 Write-up표튜터와 함께하는 Pwnable/FTZ Write-up (11~20) 2019. 2. 5. 07:23
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다.FTZ 14번 문제이다. 코드를 보니 이번에는 fgets로 길이를 주어줬다.그리고 밑에 if문을 보니 check라는 값이 0xdeadbeef 이면 다음원한으로 "/bin/sh"이 실행된다는 것을 알 수 있었다.그러므로 해야할 일은 바로 check값을 0xdeadbeef로 맞춰주는 것이다. 어셈블리어 코드를 보니 fgets으로 값을 받고나서 ebp-16에 있는 값이 0xdeadbeef인지 비교하였다.저 부분이 바로 check의 주소라는 것을 알 수 있었다. a값을 몇개 넣어주고 실행을 해보았다. 0xbfffef88까지 44개임으로 45개까지 입력가능한 fgets()가 문제가 되지 않았다. 그럼으로 바로 40개의 a값을 채우고 0xdeadbeef로 조건..
-
FTZ 13번 Write-up표튜터와 함께하는 Pwnable/FTZ Write-up (11~20) 2019. 2. 5. 04:47
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. 이번문제 FTZ 13번의 코드이다.strcpy로 인한 스택 오버플로우 취약점이 보인다.하지만 이전 문제들과 다른점이 있다.바로 i 라는 변수값이 0x01234567이 아니면 프로그램이 종료된다.마치 Stack Canary 처럼 뭔가 버퍼의 값이 바뀌는 것을코드를 통해 체크하여 종료시키는 느낌이다ㅎㅎ 그렇기 때문에 버퍼오버플로우를 이용하면서 i의 값은 0x01234567로 가져가면 될 것 같다. 4번째 줄에서 볼 수 있듯이 ebp-12에 0x01234567의 값이 채워짐을 알 수 있었고저 주소가 변수 i라는 것을 알 수 있었다. strcpy에 breakpoint를 걸고 버퍼의 크기보다 약간 적은 값 1000을 넣어보았다.ret 주소가 0x420155..