버퍼 입력

libc_start_main의 주소를 leak 하기 위해서 0x48 길이만큼 버퍼에 입력하는 이유가 뭔가요?
gdb로 어셈블리를 보아도 0x50만큼 메모리 공간 만들던데 무슨 이유에서 libc_start_main의 주소가 노출되는지 모르겠습니다

#시스템_해킹 #공격기법 #hook_overwrite
작성자 정보
답변 1
avatar
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로 메모리를 살펴보시면서 분석하시면 이해하시는데 많은 도움이 될거에요

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