https://dreamhack.io/forum/qna/3781
이전질문입니다.
pwndbg> nearpc main
► 0x40121f <main>      endbr64
0x401223 <main+4>     push   rbp
0x401224 <main+5>     mov    rbp, rsp
0x401227 <main+8>     sub    rsp, 0x30
0x40122b <main+12>    mov    eax, 0
0x401230 <main+17>    call   init                      <init>
0x401235 <main+22>    lea    rax, [rip + 0xdd0]
0x40123c <main+29>    mov    rdi, rax
0x40123f <main+32>    mov    eax, 0
0x401244 <main+37>    call   printf@plt                      printf@plt
0x401249 <main+42>    lea    rax, [rbp - 0x30]
이렇게 scanf가 안나오는데 어떻게 해야하는지 아시나요?
pwndbg> disassemble main
Dump of assembler code for function main:
0x000000000040121f <+0>:	endbr64
0x0000000000401223 <+4>:	push   rbp
0x0000000000401224 <+5>:	mov    rbp,rsp
0x0000000000401227 <+8>:	sub    rsp,0x30
0x000000000040122b <+12>:	mov    eax,0x0
0x0000000000401230 <+17>:	call   0x401196 <init>
0x0000000000401235 <+22>:	lea    rax,[rip+0xdd0]        # 0x40200c
0x000000000040123c <+29>:	mov    rdi,rax
0x000000000040123f <+32>:	mov    eax,0x0
0x0000000000401244 <+37>:	call   0x401070 printf@plt
0x0000000000401249 <+42>:	lea    rax,[rbp-0x30]
0x000000000040124d <+46>:	mov    rsi,rax
0x0000000000401250 <+49>:	lea    rax,[rip+0xdbd]        # 0x402014
0x0000000000401257 <+56>:	mov    rdi,rax
0x000000000040125a <+59>:	mov    eax,0x0
0x000000000040125f <+64>:	call   0x4010a0 __isoc99_scanf@plt
0x0000000000401264 <+69>:	mov    eax,0x0
0x0000000000401269 <+74>:	leave
=> 0x000000000040126a <+75>:	ret
End of assembler dump.
pwndbg> x/s 0x4010a0
0x4010a0 __isoc99_scanf@plt:	"\363\017\036\372\362\377%\205/"
pwndbg> x/s 0x40125f
0x40125f <main+64>:	"\350<\376\377\377\270
이렇게 나오는데 뭐가 문제인지 모르겠네요
x/s [주소]는 해당 주소에 있는 문자열로 출력하는 명령어이기 때문에
x/s 0x4010a0을 하면 0x4010a0에 저장된 메모리가 출력이 돼요!
그런데 0x4010a0은 scanf@plt의 주소이므로(일단은 scanf주소라고 생각하시면 됩니다.) 해당 주소에 있는 값, 즉 scanf 코드 조각이 출력되어서 아래처럼 나오는 거예요
0x4010a0 __isoc99_scanf@plt: “\363\017\036\372\362\377%\205/” 얘처럼요
마찬가지로 0x40125f는 main+64을 나타내므로 거기에 있는 메모리, 즉 메인함수 내의 코드조각이 출력이 되겠죠
"%s"이 출력되게 하고 싶으시면 'x/s scanf주소'가 아니라 x/s 0x402014를 해야할 것 같네요
"%s"는 scanf의 첫 인자 rdi에 저장되어있을 테니까 보여주신 코드를 보면
0x0000000000401250 <+49>: lea rax,[rip+0xdbd] # 0x402014
0x0000000000401257 <+56>: mov rdi,rax
0x000000000040125a <+59>: mov eax,0x0
0x000000000040125f <+64>: call 0x4010a0 __isoc99_scanf@plt
rdi에 0x40214가 들어가는 것을 확인할 수 있어요
마지막으로 https://learn.dreamhack.io/58#7 처럼 scanf 아래 인자까지 이쁘게 나오게하려면 그냥 저 위치까지 실행하시면(즉 rip가 저 위치까지 도달했을 때) 저렇게 알아서 나옵니당
궁금한거 있으시면 또 댓주세용!
