버퍼 입력
libc_start_main의 주소를 leak 하기 위해서 0x48 길이만큼 버퍼에 입력하는 이유가 뭔가요?
gdb로 어셈블리를 보아도 0x50만큼 메모리 공간 만들던데 무슨 이유에서 libc_start_main의 주소가 노출되는지 모르겠습니다
#시스템_해킹
#공격기법
#hook_overwrite
작성자 정보
답변
1
p0her
Open Beta Tester
0x48 만큼 입력한 문자열 뒤에 바로 ret에 __libc_start_main 이 위치해서 그렇습니다. 왜냐면 우리가 입력하는 공간은 buf[0x30]
<< 이 곳에 입력을 받는건데 read로 어떤 공간에 집어넣나 어셈블리어로 보시면
lea rax,[rbp-0x40]
임을 알수 있습니다. 근데 카나리가 적용 돼 있어서 rbp - 0x8엔 카나리가 위치하고, rbp엔 sfp가 위치하니 0x30 + 0x8 + 0x8 = 0x40 해서 sfp에 도달하고 + 0x8을 더 해주면 sfp까지 덮여서 ret 직전까지 오게 되니까 최종적으로 __libc_start_main이 유출 됩니다.
pwndbg> x/10gx $rsi
0x7fffffffe610: 0x6161616161616161 0x6161616161616161
0x7fffffffe620: 0x6161616161616161 0x6161616161616161
0x7fffffffe630: 0x6161616161616161 0x6161616161616161
0x7fffffffe640: 0x6161616161616161 0x6161616161616161
0x7fffffffe650: 0x0a61616161616161 0x00007ffff7a03c87
이건 제가 첫 번째 read 받을 때 0x48개의 문자를 입력해준 다음의 스택 상태인데, 0x7ffff7a03c87을 잘 보시면
pwndbg> x/10gx 0x7ffff7a03c87
0x7ffff7a03c87 <__libc_start_main+231>: 0x4800021482e8c789 0xc148003ced13058b
0x7ffff7a03c97 <__libc_start_main+247>: 0x30250433486411c8 0x058b48d0ff000000
0x7ffff7a03ca7 <__libc_start_main+263>: 0x11c8c148003ceced 0x0000302504334864
0x7ffff7a03cb7 <__libc_start_main+279>: 0x84c2940f08fff000 0x0000003cba3275d2
0x7ffff7a03cc7 <__libc_start_main+295>: 0x00000000841f0f66 0xeb050fd089ff3100
로 __libc_start_main이 위치한걸 알 수 있습니당. 항상 gdb로 메모리를 살펴보시면서 분석하시면 이해하시는데 많은 도움이 될거에요