촉촉한초코칩
[Dreamhack] addition-quiz 본문
코드
// Name: chall.c
// Compile Option: gcc chall.c -o chall -fno-stack-protector
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <time.h>
#define FLAG_SIZE 0x45
void alarm_handler() {
puts("TIME OUT");
exit(1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
}
int main(void) {
int fd;
char *flag;
initialize();
srand(time(NULL));
flag = (char *)malloc(FLAG_SIZE);
fd = open("./flag", O_RDONLY);
read(fd, flag, FLAG_SIZE);
close(fd);
int num1 = 0;
int num2 = 0;
int inpt = 0;
for (int i = 0; i < 50; i++){
alarm(1);
num1 = rand() % 10000;
num2 = rand() % 10000;
printf("%d+%d=?\n", num1, num2);
scanf("%d", &inpt);
if(inpt != num1 + num2){
printf("Wrong...\n");
return 0;
}
}
puts("Nice!");
puts(flag);
return 0;
}
i는 0부터 49까지 증가되고 num1와 num2는 랜덤으로 생성된다. 이 두 값을 더하고, 만약 입력한 값이 더한 값과 같아야 flag가 출력된다.
공격
314번에서 두 값을 비교하고 틀리면 340으로, 맞으면 flag가 출력된다.
여기에 break를 걸고 실행해본다.
cmp에 오면 edx에 두 값을 합한 값이 들어있다. 이 값에 맞게 eax의 값을 바꿔준다.
그리고 여기서 rbp-4와 49를 비교한다.
이때 rbp의 값은 0x7fffffffde40이며 4를 빼면 7FFF FFFF DE3C이 나온다.
이 값이 0x31과 같아야 하므로 dword ptr의 값은 0x00000031이 되어야 한다.
그래서 값을 넣었는데 n을 눌러도 여기서 멈춰서 진행이 안된다.. → backtrace
그러면 이렇게 50을 계속 반복해야 하는건가..? 검색해보았다.
코드
파이썬 코드를 작성해서 하더라,,ㅎㅎ
from pwn import *
host = remote('host(num).dreamhack.games', (port))
for i in range(50):
equation = host.recvline(1024)
num = str(equation).split("'")[1][0:-4].split("+")
host.sendline(str(int(num[0]) + int(num[1])))
print(host.recv(1024))
출처: https://hyungin0505.tistory.com/77 [간디의 세상:티스토리]
50번을 반복해서 두 숫자를 가져오고 정답을 보낸다.
일단 성공..
'Study > MISC' 카테고리의 다른 글
[Dreamhack] Robot Only (1) | 2024.09.17 |
---|---|
[Dreamhack] Snowing! (0) | 2024.09.17 |
[Dreamhack] littlevsbig (0) | 2024.09.04 |
[Dreamhack] broken-png (0) | 2024.09.04 |
[Dreamhack] **Exercise: Docker (0) | 2024.08.20 |