2017-12-25 14 views
0

NASM 어셈블리 코드에서 scanf와의 몇 가지 특별한 동작을 감지합니다.x86 NASM은 매개 변수로 전달되지 않은 주소에서 값을 변경합니다.

mov rdi, fmt 
mov rsi, r14 
call _scanf 

fmt이 같은 data 섹션에 선언

mov rdi, fmt 
mov rsi, r15 
call _scanf 

: : 첫 번째 scanf 전에

section .data 
fmt: db "%d", 0 

, 주소 R14 및 R15의 난을 scanf 두 통화를 있습니다 :

r14 = 0x0000000000002104 
r15 = 0x0000000000002105 
scanf은 "2"를 입력하면 해당 주소 출력 0

중 하나에 me read -fd -c1을 실행 LLDB에서

는 0x0000000000002104의 값은 초, "2"를 입력 한 후 고맙게도 2.

scanf은 0x0000000000002105의 값이 지금 0x0000000000002104의 값이 514

내가 다른 곳에서 scanf에 호출 한 후 메모리에 유사한 변화를 경험하고 필요한 경우이를 재현하지만 사람이 있는지 알고 싶어하다, 그러나 2입니다 이것을 경험했습니다.

+2

해당 주소 2104와 2105는 1 바이트 띄어 지지만 "% d"을 사용하면 4 바이트 정수로 채워질 수 있습니다.이 바이트는 읽으려는 위치 이후의 바이트를 마비시킬 수 있습니다. 검증 가능한 최소한의 예제가 부족합니다. 코드를 게시하면 더 잘 이해할 수 있습니다. MacOS에 있나요? scanf가 호출되기 전에 _AL_ 레지스터를 0으로 설정 했습니까? –

+2

514는 0x0202, 즉 2105와 2104의 바이트 값의 dword 조합입니다. – prl

+0

@MichaelPetch : 주석에'[mcve]'를 사용할 수 있습니다 : [mcve]로 확장됩니다. 이것은 거의 너무 적습니다 만,이 특정 질문은 이에 근거하여 답할 수 있다고 생각합니다. 나는 OP가 scanf 이후 integer 값을 읽는 데 OP가 사용하는 너비를 확인하고, dword인지 확인하고,'int'의'% d'가 저장하는 너비와 일치하는지 확인하려고합니다. –

답변

3

이전에는 4 바이트를 읽는 scanf의 형식으로 %d을 사용했습니다. 그러나 r14 및 r15의 주소는 bss 섹션에서 1 바이트 만 예약되었습니다. 나는 4 바이트를 예약하고 프로그램이 예상대로 작동하도록 이것을 바꿨다.

관련 문제