목록buffer (31)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/sM3WD/btqBGqbRWIi/uZzt5fJXTCWmwuNNKcPkB1/img.png)
#include #include #include #include void shell() { setreuid(geteuid(), geteuid()); system("/bin/bash"); } void sup() { printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n"); } void main() { int var; void (*func)()=sup; char buf[128]; fgets(buf,133,stdin); func(); } fgets()함수에서 취약점이 발생한다. ssh -p 2222 app-systeme-ch15@challenge02.root-me.org password: app-systeme-ch15 ssh서버에 접속해주자. buf 128byte를 채우고 shell()함수..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/KgLaD/btqBGrhw6yL/iR5a5NyvFwvCjCwT2HS7cK/img.png)
#include #include #include #include int main() { int var; int check = 0x04030201; char buf[40]; fgets(buf,45,stdin); printf("\n[buf]: %s\n", buf); printf("[check] %p\n", check); if ((check != 0x04030201) && (check != 0xdeadbeef)) printf ("\nYou are on the right way!\n"); if (check == 0xdeadbeef) { printf("Yeah dude! You win!\nOpening your shell...\n"); setreuid(geteuid(), geteuid()); system("/bi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/nuvBr/btqBDXt6Vo7/7kASeCKtS9Kqn9g3xxlVG0/img.png)
stack 영역을 사용할 수 없다. 라이브러리 영역도 사용할 수 없다. 또한 fgets()함수에서 arg로 입력을 받지않고 뜬금없이 stdin으로 입력을 받는다. stdin은 표준입력 파일 스트림이다. stdin은 입력 버퍼를 가지고 있다. 파일 복사 후 gdb로 파일을 열어주자 eax 레지스터에 0x8049a3c가 복사되고 push 된다. 0x8049a3c가 stdin의 주소이다. ret가 실행되기전 부분에 break point를 걸어주고 프로그램 실행 후 값을 넣어주자 stdin+4는 buffer의 end부분을 가리키고 stdin+12는 buffer의 start부분을 가리킨다. buffer의 start부분인 0x40015000을 payload에 사용하면된다. 페이로드는 NOP * 19 + shellc..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/zT7eA/btqBuQuMfms/QgeY9F2grDsl2ri4JsRB4K/img.png)
주석에 FEBP라고 적혀있다 Fake EBP일것이다. 파일을 복사 후 gdb로 파일을 열어주자 ret가 실행되기전 leave 부분에 break point를 걸어주고 값을 넣어주자 leave - ret Gadget은 0x080484f0이다. 스택을 확인해보면 buffer의 주소는 0xbffffab0이다. 0xbffffab0 + 4 = 0xbffffab4 0xbffffab0 - 4 = 0xbffffaac 페이로드는 &buffer + 4 + dummy + shellcode + &buffer - 4 + leave - ret Gadget [4byte] [11byte] [25byte] [4byte] [4byte] payload ./zombie_assassin $(python -c 'print "\xb4\xfa\xf..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/w8t00/btqBpQnXDzJ/TQvcr4NOL9blO6MUbi3aX0/img.png)
RTL (Return-To-Libc) Return To Library 줄여서 RTL 기법이라고 한다. 쉘 코드없이 쉘을 실행할 수 있다. 메모리에 미리 적재되어 있는 공유 라이브러리 함수의 주소 RET에 덮어씌어 현재 코드에 사용되지 않는 함수를 실행 시킬 수 있다. RTL기법을 사용하는 대표적인 이유는 NX bit 방어기법을 우회하기 위해 사용한다. NX bit NX bit는 공격자가 스택, 힙, 데이터 영역에서의 공격코드를 실행하지 못하게 한다. 예제 argv[1][47]가 "\xbf"이면 프로그램을 종료를 시킨다. ret 변조시 bf로 시작하지 않는 주소로 변조시킬 수가 없기때문에 스택으로 주소를 변조하는 것은 불가능하다. RET를 공유 라이브러리 주소로 변조시켜 함수 내부 RET를 쉘을 실행시키는..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TSpbu/btqBpgfVjO9/BMS1bXDkIcBk2X9hmQtEy0/img.png)
RTL기법을 이용한 문제이다. system()함수의 주소와 "/bin/sh"의 주소를 구해주자. system()함수의 주소는 0x40058ae0이다. "bin/sh"의 주소도 구해주자. #include int main() { int system = 0x40058ae0; while(memcmp((void*)system, "/bin/sh", 8)) system++; printf("%x\n", system); return 0; } 위의 소스코드를 작성해주고 실행해주자. "bin/sh"의 주소는 0x400fbff9이다. 페이로드는 (buffer + sfp) + system()주소 + dummy + "/bin/sh"주소 [44byte] [4byte] [4byte] [4byte] payload ./bugbear $..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/94Svd/btqBh2vc2ZV/2V9AlVSkPyQfK4tDhpklqk/img.png)
#include #include #include #include void vuln(char *string) { volatile int target; char buffer[64]; target = 0; sprintf(buffer, string); if(target == 0xdeadbeef) { printf("you have hit the target correctly :)\n"); } } int main(int argc, char **argv) { vuln(argv[1]); } 앞에서 나온 Stack문제와 동일해서 딱히 설명할 부분이 없다. 버퍼에 64를 채우고 0xdeadbeef를 리틀 엔디언 방식으로 전달해주면 된다. ./format0 $(python -c 'print "\x90" * 64 + "\xe..