완료됨
풀이 방식

버퍼가 80이고 read를 통해 0x80만큼 버퍼에 입력되니

버퍼 시작 주소(rbp-0x60)를 확인하고

SFP 8바이트 고려해서 더미데이터 입력하고

리턴 주소를 버퍼 시작 주소로 바꾸는 형태로 실행시켰습니다..

payload=shellcode+ b'a'*(0x68-len(shellcode))+p64(buf_add)
이렇게 입력했는데 안되는 이유가 뭘까요?

#pwnable
작성자 정보
더 깊이 있는 답변이 필요할 때
드림핵 팀과 멘토에게 직접 문의해 보세요!
답변 1
int main(int argc, char *argv[]) {
    int stdin_fd = 0;
    int stdout_fd = 1;
    int flag_fd;
    int tmp_fd;
    char buf[80];

    initialize();

    // read flag
    flag = (char *)malloc(FLAG_SIZE);
    flag_fd = open("./flag", O_RDONLY);
    read(flag_fd, flag, FLAG_SIZE);
    close(flag_fd);

    tmp_fd = open("./tmp/flag", O_WRONLY);

    write(stdout_fd, "Your Input: ", 12);
    read(stdin_fd, buf, 0x80);

    write(tmp_fd, flag, FLAG_SIZE);
    write(tmp_fd, buf, 80);
    close(tmp_fd);

    return 0;
}

여기서 보시면 flag를 읽어서 flag라는 변수에 저장하게됩니다.

그리고 flag를 write로 ./tmp/flag에 저장을 하게되는데, 이때 잘 생각해 보시면 풀리실겁니다.

shellcode를 넣어봤자 stack 주소를 몰라서 안풀리십니다..
힌트는 tmp_fd 입니다.

2024.11.23. 12:33