목록분류 전체보기 (101)
ipwn
이번 단계는 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 ..
이번 단계는 skeleton 단계이다. 바로 접속후 파일들을 보겠다. golem 파일과 golem.c 코드가 있다. 바로 코드를 읽어보도록 하겠다. 코드를 살펴보니, stack 영역의 공간이 ret 부분말고 전부 초기화 되는 것을 확인할 수 있다. 그럼 어떻게 해결해야할까? 사실 나도 이 부분은 처음 풀 때 다른 블로그들을 많이 참조했다. 바로 공유 라이브러리(LD_PRELOAD)를 사용해야 한다. 공유 라이브러리란 우리가 지정한 사용자 함수를 라이브러리에 올려 라이브러리 함수처럼 사용하는 것이다. 우리가 사용하는 라이브러리 libc.so와 같은 라이브러리들은 효율적으로 함수를 사용하기 위해 메모리상에 적재된다. 그런데 이러한 라이브러리들이 할당받는 공간은 이 사진과 같이 이뤄져있다. (저 사진의 dat..
이번 단계는 vampire단계이다. copy file을 만들고 바로 파일을 살펴보겠다. 기본적으로 skeleton file과 skeleton.c 코드가 있다. 바로 코드를 읽어보도록 하겠다. 코드가 제한이 많아졌다. 다 비슷한 제약이지만 가장 큰 문제가 생겼다. 바로 argv가 모두 사라졌고 buffer의 앞 공간도 사라졌다. 즉 쓸 공간이 거의 모두 없어졌다... 이럴 경우에는 어떻게 해야할까? 일단 조건에 맞게 값을 넘겨주어 core dump를 한 번 보도록 하겠다. 이렇게 값을 넘겨주었다. 한 번 core dump를 gdb로 debugging 해보겠다. 사용 가능한 공간이 정말 하나도 없어보인다. 하지만 맨 밑 부분 환경변수가 존재할 부분을 보면 ./로 시작하는 문장이 보인다. 한번 string을 ..
이번 단계는 troll 단계이다. 이번엔 바로 copy file을 생성하고 시작해보도록 하겠다. 바로 코드를 보도록 하겠다. 저번보다 코드가 많이 짧아졌다. argv를 몇 개 사용해도 제한이 없어졌고, argv[1]의 길이 제한도 사라졌다. 하지만 argv[1][46] == \xff이면 프로그램을 종료시킨다. 이 말은 즉 return address에서 2번째 bit가 \xff가 아니어야 한다는 말이다. 이건 어떻게 해줘야할까? 일단 예전처럼 뒷 공간에 nop을 200개 넣고 shellcode를 넣는 방식으로 core dump를 한 번 가져와보자. core dump를 이용해 메모리를 읽어보겠다. 바로 메모리를 봤지만 buffer에서 \x90의 위치는 0xbfffXXXX으로이뤄져있다. 즉 두번째 bit가 \..