-
[LOB] Orc -> Wolfman Write-up표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 2019. 2. 9. 21:50
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. Orc 문제는 goblin과 비슷하지만 buffer hunter가 추가되어있다.하지만 본의아니게 goblin에서 했던 방법2의 풀이법이면 buffer를 memset하더라도우회할 수 있었다... 그러므로 바로 풀어버렸다ㅎㅎ 혹시나 설명이 부족하다면 이전 goblin -> Orc를 참고하자https://xn--vj5b11biyw.kr/115 코드를 보자정말로 buffer hunter만 추가되었다. 대충 if문을 맞춰서 주소값을 넣고 payload를 만들어서core파일을 분석해보았다. core파일내가넣은 sfp를 덮은 aaaa값과 대충넣은 주소가 보였고그 다음에 쉘코드가 보였다.그러므로 ret 다음 주소는 0xbffffac0이 된다. payload는 다..
-
[LOB] Goblin -> Orc Write-up표튜터와 함께하는 Pwnable/The Lord Of the BOF Write-up 2019. 2. 9. 00:33
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. 이전까지의 문제들은 전에 풀어봤던 문제들과 비슷해서 너무나 쉽게 풀렸다.그래서 살짝(?) 자만했는데 이번 문제에서 뚜두려맞았다ㅋㅋegghunter라는 개념이 필요했다. 그래서 인지 꽤 오랜시간 삽질을 했던 것 같다. 소스코드를 보자!우선 40크기의 버퍼를 주어줬고egghunter라는 부분이 있다.이 부분은 환경변수의 값을 0으로 초기화시키기 때문에이전까지 써왔던 환경변수를 이용한 eggshell을 사용할 수 없게 만든다. 또한 그 아래에는 argv[1]의 47번 배열 즉, 48번째의 배열의 값이 "\xbf"가아니면 "stack is still your friend라는 문구와 함께 프로그램이 종료된다.이 부분에서 알 수 있는 것은 아마도 buf 크기..
-
memset을 이용한 초기화 문제Coding/Tip !! 2019. 2. 8. 15:03
네트워크 코딩을 하다보면 memset을 이용하는 일이 자주 생긴다.(물론 다른 코딩에서도 많이 쓰일거라고 생각한다) 하지만 이러한 memset을 사용할 때 주의할 점들이 있다. 바로 1Byte 변수(uint8_t, char, unsigned char 등)이 아닌 변수들을 초기화할 때0의외의 값을 사용하면 안된다는 점이다. 그 이유는 만약 4Byte 변수인 int형을 memset으로 초기화하게되면바이트 단위로 초기화가 처리되어 00000001 00000001 00000001 00000001 이 되버려서 값이 0이아닌 다른 수가 되어버린다. 또한 new, malloc 등을 이용한 동적으로 생성한 배열, 변수가 있는struct, class에서는 memset을 이용한 초기화를 해주면 안된다. 예를 들어 다음과 ..
-
[Codegate2013] Vuln200 Write-up표튜터와 함께하는 Pwnable/CTF Write-up 2019. 2. 7. 21:06
혹시나 이상하거나 잘못된 것이 있다면 댓글 부탁드립니다. Codegate2013 Vuln200 Write up이다. 다하고 보니 생각보다 쉽지만 너무 어렵다고 생각해서 그런지 많이 돌아온 듯 하다..ctf 출제 문제들을 많이 풀어보지 않아서 그런거라고 위안을 삼고 노력해야겠다ㅠ참고로 파일명은 hello로 편의를 위해 내가 변경한 것이다.(오해 노노~) 우선 문제를 풀기위해 셋팅을 해주고~실행을 시켜보았다.몇 가지 메뉴가 나왔다~ 대충 이런느낌의 프로그램이었다.md5나 base64인코딩과 디코딩 이 파일에 어떤 mitigation이 있는지 확인해보았다.NX보호기법이 없기 때문에 스택에서 공격이 가능할 것으로 보이고symbol이 지워져있었다. 그리고 dynamically linked로 공유라이브러리를 사용하..
-
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로 조건..