물먹는산세베리아

[pwn] 반복 계산 문제 본문

카테고리 없음

[pwn] 반복 계산 문제

suntall 2021. 4. 28. 03:57
SWING_PwnableStudy

 

C파일을 같이 제공받아서 ida로 깔 필요는 없었음. 야호!

 

swing_pwn_chall.c

#include <stdio.h>
#include <stdlib.h>

int main() {
  int i, a, b, ans;
  srand(time(0));

  for (i = 1; i <= 20; i++) {
    a = rand() % 20000;
    b = rand() % 20000;
    printf("#%d: %d + %d = ?\n", i, a, b);
    printf("> ");
    scanf("%d", &ans);
    if (a + b == ans) {
      printf("Correct!\n");
    }
    else {
      printf("Wrong!\n");
      return 0;
    }
  }
  printf("Congrats! flag{good swing}");
}

 

swing_pwn_chall

근데 왜 +에서 끊는 거지? 저 숫자들을 다 문자로 인식해서 그런가?

C코드를 보면 2개의 랜덤값을 더한 값을 성공적으로 20번 구했을 때  flag를 구할 수 있는 문제임을 알 수 있다. 

일단 실행을 해보면 '+' 앞에 첫번째 숫자, '='앞에 두번째 숫자가 오고, 다음 줄 '>' 다음에 답을 입력할 수 있도록 되어있다.


payload.py

#!/usr/bin/env python

from pwn import*

p = process("./swing_pwn_chall")
for i in range(20):
	p.recvuntil(': ') 
	a = int(p.recvuntil('+')[:-1])
	b = int(p.recvuntil('=')[:-1])
	anw = a + b
	p.sendline(str(anw))
p.interactive()

 

 

pwntools 파이썬 툴을 사용했다.

갖고 있는 파일이라서 process로 파일과 연결하여 실행시켰다. C코드를 보면 20번 반복하도록 되어 있으므로 파이썬 코드에서도 20번 반복하도록 작성하였다. 

 

p.recvuntil(':')

먼저, 첫번째 숫자에 접근하기 위해서는 바로 앞에 있는 ':'까지 읽어야 한다. 

': '를 넣어야 하는 줄 알았는데 띄어쓰기는 상관이 없는 것 같다.

 

int(p.recvuntil('+')[:-1])

첫번째 숫자를 받아오려면 +앞까지 읽어야 한다. 이때 특정 문자 바로 앞까지 읽으려면 [:-1]를 사용하면된다. 문자열 형태로 받아왔지만 계산을 해야 하므로 int형으로 바꿔 a변수에 저장하였다.

 

p.sendline(str(anw))

기본적으로 sendline은 string형 데이터를 전송한다. 따라서 anw값을 str로 형변환해주었다. sendline()은 데이터와 개행문자 ("\n")을 전송하고, send()는 데이터만을 전송한다는 점에서 차이가 있다.

send(str(anw))

send로 데이터를 전송하려고 했을 때의 결과는 위와 같다. C코드에서 a,b를 더한 값 뒤에 "\n"문자를 사용해 줄바꿈을 해주었기 때문에 이에 대한 데이터를 전송하지 않는다면 데이터를 줄 때까지 기다린다. 맞나? 따라서 개행문자가 들어 있는 sendline을 사용한 것이다.

 

p.interactive()

 

마지막에 작성하여 쉘에서 직접적으로 명령을 전송하고 수신할 수 있도록 하였다. 익스플로잇과 프로세스와의 연결을 stdin, stdout <=>로 바꾸어주기 때문에 익스플로잇이 끝나면 $가 나온다.

근데 왜 빨간색이지 뭐가 다른거지 여기서 같은 py 실행시키면 Got EOF while sending in interactive 뜸 flag는 구했는데.. 제대로 되는 거 맞겠지..?


성공!

good swing