목록Write up (43)
ipwn
uaf를 공부한 김에 pwnable.kr uaf문제를 풀어봤다. 생각한 시나리오가 맞지 않아서 엄청 오래걸렸다.... 그리고 풀긴 풀었지만 이해가 가지 않는 부분도 많다... uaf가 어떤 취약점인지 묻는 문제이다. 사실 C++을 잘 몰라서 왜 이렇게 동작하는지는 모르겠지만, 일단 레지스터 이용해서 호출하고 그러는 거 보고 풀었다. #include #include #include #include #include using namespace std; class Human{private: virtual void give_shell(){ system("/bin/sh"); }protected: int age; string name;public: virtual void introduce(){ cout
이번에 풀 wargame은 FTZ이다. 사실 이전에 썼어야 했는데 하다보니 그냥저냥 Lord Of Bufferoveflow로 바로 넘어가버려서 이제야 쓴다. 이전 level들은 trainer level에서 배운 내용을 복습하는 느낌이기에 바로 level11부터 시작하도록 하겠다. 일단 FTZ의 환경은 기본적으로 LOB와 다르게 ASLR이 걸려있다. 즉 메모리 일부 값들이 프로그램 매 실행시마다 어지럽게 바뀔 것이다. 일단 접속을 해보도록 하겠다. ID : level11 PASSWORD : what!@#$?[level11@ftz level11]$ ls -ltotal 28-rwsr-x--- 1 level12 level11 13733 Mar 8 2003 attackme-rw-r----- 1 root level..
이번 단계는 마지막 전의 단계 nightmare단계이다. 바로 복사본을 만들고 파일들을 살펴보겠다. 12345[nightmare@localhost nightmare]$ ls -ltotal 36-rwsr-sr-x 1 nightmar nightmar 13398 Jan 18 07:49 xaviu1-rwsr-sr-x 1 xavius xavius 13398 Mar 30 2010 xavius-rw-r--r-- 1 root root 1019 Mar 30 2010 xavius.c cs 생각보다 colorscripter이 훨씬 편한 것 같다. bash도 지원해줄줄은 몰랐다. 아무튼 xavius 파일과 xavius.c 코드가 있다. 코드를 읽어보겠다. 123456789101112131415161718192021222324..
이번 단계는 succubus단계이다. 거의 끝이 보인다. 복사본을 만들고 바로 파일들을 살펴보겠다. nightmare 파일과 nightmare.c 코드가 있다. 코드를 읽어보도록 하겠다. 보아하니 힌트에는 PLT라고 쓰여있고 ret이 strcpy의 PLT로 덮여야 실행이 된다. 그리고 strcpy의 ret은 A로 memset이 된다. 그리고 argv의 갯수 제한도 없고, buffer, buffer의 뒷부분을 지워버리지 않는다. 이 문제의 해결은 생각보다 간단하다. strcpy의 원형은 char *strcpy(char *dest, const char *src)이다. 이 뜻은 dest의 주소에 있는 값을 src의 주소에 있는 값으로 덮어버린다는 의미인 것을 알 것이다. 일단 ret을 strcpy_plt로 덮..
이번 단계는 zombie_assassin이다. 바로 복사본을 만들고 파일들을 살펴보겠다 기본적으로 succubus 파일과 succubus.c 코드가 있다. 코드를 읽어보겠다. 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #incl..
이번 단계는 assassin 단계이다. 바로 복사본을 만들고 파일들을 살펴보겠다. 기본적으로 zombie_assassin 파일과 zombie_assassin.c 코드가 있다. 코드를 읽어보도록 하겠다. 코드가 저번 코드랑 조금 비슷하다. 하지만 달라진 점이 있는데 바로 strncpy로 딱 48byte만 덮어준 것이다. 이번 단계에서 사용될 기법은 바로 FAKE ebp기법이다. 이전 단계에서 ret gadget을 가져와서 사용했다면, 이번 단계에서는 leave-ret gadget을 가져와서 사용할 것이다. 사실 이 기법은 예전에 사용했던 Frame Pointer Overwrite와 굉장히 닮아있다. 일단 우리가 넘겨줄 payload는 dummy*40 + &shellcode -4 + leave-ret gad..
이번 단계는 giant 단계이다. 바로 복사본을 만들고 파일들을 보겠다. assassin 파일과 assassin.c 코드가 있다. 코드를 읽어보도록 하겠다. 코드를 보니 no stack, no RTL이라고 적혀있다. 진짜로 library영역을 막아버렸고, stack영역도 막아버렸다. 그렇다면 우리가 불러올 수 있는 영역은 code영역이 남아있다. 이번 문제는 ret sled기법을 사용하는 문제인데, 쉽게 말해서 ret을 한 번 더 호출해서 원하는 위치로 점프 시켜버리겠다는 말이다. 이 기법이 돌아가는 원리는 생각보다 간단하다. ret 어셈블리어는 pop eip jmp eip 로 이뤄진 걸 알 수 있는데 return address에 ret을 넣어주면 esp가 한 칸 그러니까 4byte가 증가되게 되고 그 ..
이번 단계는 bugbear단계이다. 바로 /bin/sh의 주소를 가져오는 파일을 만들고 파일들을 읽어보자. 아마 RTL을 주로 하는 단계에서는 copy file이 필요 없을 것 같다. 기본적으로 giant파일과 giant.c 코드가 있다. 코드를 읽어보도록 하겠다. 코드를 보아하니 똑같이 RTL 기법으로 푸는 문제인듯 하다. 일단 가장 먼저 ldd 명령어와 grep 명령어로 libc의 주소를 구한다. 그리고 nm 명령어와 grep 명령어로 libc.so.6에서 execve 함수의 offset을 구한다. 그리고 그 둘을 합친뒤 execve함수의 주소를 구해서 만약 return address가 execve함수가 아닐 경우 프로그램을 종료시켜버린다. 즉 이 단계는 RTL기법을 execve함수로 진행해서 she..
이번 단계는 darkknight 단계이다. 바로 copy file을 만들고 파일을 확인해보겠다. bugbear파일과 bugbear.c 코드가 있다. 바로 코드를 읽어보겠다. 코드를 보니 이번엔 예전과 다르게 return address의 마지막 byte의 부분이 \xbf가 아니어야한다. 그리고 힌트 부분을 보니 RTL을 사용하는 문제인 것 같다. RTL(Return To Libc)는 Return address를 library function으로 덮어주어서 함수를 실행시키는 기법이다. 이 기법을 설명하기 이전에 일단 copy을 통해서 system함수의 주소를 얻어오자. 일단 system함수의 주소는 0x40058ae0이다. 만약 return address가 system 함수로 덮였다고 가정하면 system ..
이번 단계는 golem 단계이다. 바로 copy file을 만들고 파일을 살펴보겠다. 기본적으로 darkknight 파일과 darkknight.c 코드가 있다. 바로 코드를 읽어보겠다. 코드를 보니 여러 제한이 사라진 대신 strncpy로 1byte overflow밖에 할 수 없다. 이 말은 즉 sfp를 1byte overflow를 일으켜서 shellcode를 실행시키라는 말이 된다. 즉 FPO(Frame Pointer Overflow) 기법을 사용한다는 말이다. 우리가 넘겨줄 payload는 shellcode(34byte) + dummy*6 + 1byte overwrite가 될 것이다. 기본적으로 sub function에서 leave와 ret이 일어날 것이다. 즉 mov esp, ebp pop ebp ..