nearpc명령어 질문 2

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


이렇게 나오는데 뭐가 문제인지 모르겠네요

#시스템해킹 #공격기법 #buffer_overflow
작성자 정보
답변 1
avatar
Rosieblue
워게임 고인물

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가 저 위치까지 도달했을 때) 저렇게 알아서 나옵니당

궁금한거 있으시면 또 댓주세용!

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