Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- REDIS
- LOB
- doupdate
- ncurses
- C언어
- level trigger
- 취약점
- iptables
- BOF
- Compiler
- epoll_wait
- DOCKER-USER
- .net core 7
- 풀이
- mvwin
- Docker
- architecture
- edge trigger
- rfc5508
- cbpf
- wnourefresh
- vtable
- packet flow
- NAPT
- .nret core 배포
- 어셈블리어
- epoll
- wrefresh
- packet filter
- ioctl
Archives
- Today
- Total
Tuuna Computer Science
[L.O.B] Load Of BufferOverflow) bugbear -> giant 본문
이번에는 bugbear에서 giant로 가는 문제를 풀어볼 생각이다.
일단 문제의 소스를 보자
좀 기네요;;
일단 이를 차분히 분석해보면
이 소스코드에선 libc의 주소값을 구해서 buffer에 저장한뒤 lib_addr이라는 변수에 저장합니다.
여기서 ldd assassin | grep libc란 assassin이라는 프로그램의 의존성이 있는 라이브러리중 libc를 찾는다는 뜻입니다.
근데 우린 assassin을 접근할 수 없죠? 그럼 터미널에서 assassin대신 giant로 해봐여^^ 같은 시스템이니 같은 주소로 찍히겠져
자 libc의 주소는 0x40018000입니다.
이제 다음 코드를 봅시다.
nm 명령어는 어떠한 것의 심볼을 알아볼 때 사용하는 것입니다.
이 코드는 libc.so.6에서 __execve의 심볼의 오프셋을 buffer에 넣고 execve_offset에 넣습니다.
오프셋은 0x00091d48입니다.
다음의 코드에서 우리가 구한 라이브러리의 주소 + execve함수의 오프셋을 더해
execve함수의 주소값을 알아 냅니다.
자 execve함수의 주소값은 0x400a9d48입니다.
자그럼 공격패턴을 생각해봅시다. execve함수의 주소값을 알아냈으니
이 함수의 인자값으로 execve(system(), /bin/sh, NULL); 이렇게 실행하여 쉘을 따는 것입니다!
그럼 system()함수의 주소를 알아봅시다.
system 함수의 주소값은 0x40058ae0이네요!
그럼 /bin/sh의 주소값을 알아볼까여?
이렇게 코드를 작성하고
실행시키니 0x400fbff9가 나왔습니다 ㅎ
여기서 아까 제가 NULL을 마지막에 줬죠? 이제 널값이 있는 주소도 한번 찾아봅시다.
0xbffffe1b가 비어져 있네요 ㅎㅎ 씁시다!
그래서 완성된 payload는
./giant "`python -c 'print "A"*44+"\x48\x9d\x0a\x40"+"\xe0\x8a\x05\x40"+"AAAA"+"\xf9\xbf\x0f\x40"+"\x1b\xfe\xff\xbf"'`"
execve를 올리고 system올리고 ret올리고 /bin/sh올리고 널값 올리고해서 이렇게 나옵니다.
그리고 시스템에서 \x0a를 \x00으로 인식해서 이를 방지하기 위해 python 자체 나오는 값을 " "로 묶어줘여합니다.
'L.O.B' 카테고리의 다른 글
[L.O.B] Load Of BufferOverflow) assassin->zombie_assassin (0) | 2019.03.30 |
---|---|
[L.O.B] Load Of BufferOverflow) golem -> darkknight (0) | 2019.03.26 |
Comments