FSB(6)
-
pwnable.kr. - fsb
보호되어 있는 글입니다.
2021.08.29 -
pwnable.xyz - GrownUp
// local variable allocation has failed, the output may be wrong! int __cdecl main(int argc, const char **argv, const char **envp) { char *src; // ST08_8 __int64 buf; // [rsp+10h] [rbp-20h] __int64 v6; // [rsp+18h] [rbp-18h] unsigned __int64 v7; // [rsp+28h] [rbp-8h] v7 = __readfsqword(0x28u); setup(*&argc, argv, envp); buf = 0LL; v6 = 0LL; printf("Are you 18 years or older? [y/N]: "); *(&buf + ..
2021.08.02 -
HackCTF - ChildFSB
중간에 버퍼 꼬여서 5시간 걸린 문제이다. FSB공부하는 중이지만 버퍼안꼬였으면 2시간이면 풀 문제였는데 5시간이 걸렸다니 마음이 아프다. int __cdecl main(int argc, const char **argv, const char **envp) { char buf[24]; // [rsp+0h] [rbp-20h] BYREF unsigned __int64 v5; // [rsp+18h] [rbp-8h] v5 = __readfsqword(0x28u); Init(); puts("hello"); read(0, buf, 25uLL); printf(buf); return 0; } 버퍼가 공간이 부족하기에 main loop를 만든 후에 나눠서 입력하면 된다. 1. main loop 생성하기(__stack_ch..
2021.07.08 -
HackCTF - babyfsb
문제는 위와 같습니다. ida를 통해서 문제를 확인해보면 위와 같은 구조를 가지고 있습니다. 전형적인 FSB문제입니다. 1. 어떻게 main으로 반복할 것인가 2. 어떻게 canary를 처리할 것인가 3. 어떻게 system주소를 가져올 것인가 세가지에 대해서 생각해보면 됩니다. 1번의 경우 canary를 덮은 경우 __stack_chk_fail함수를 호출하게 되는데 이 함수의 got를 main함수로 덮으면 됩니다. 2번의 경우 1번을 위해 사용하면 됩니다. 3번의 경우 main으로 복귀하는 루프문이 만들어진 이후 __libc_start_main인 main의 ret은 fsb를 이용해서 leak해서 풀이가 가능합니다. 아래는 exploit 코드입니다. from pwn import * #r = process..
2021.06.26 -
HACKCTF - You are silver
해당 문제를 실행시켜보면 이름을 입력받고, 출력해주고, 세그멘테이션 오류를 출력합니다. ida로 메인함수부분을 확인해보면 printf에서 입력은 부분들을 그대로 출력해주니 이 부분에서 segmentation오류가 발생합니다. 아마 FBS관련 문제 같았습니다. 하지만.. 전 fsb에 대해서 약점을 가지고있어서... 공부하고 오느라 푸는데 시간이 3일정도 걸렸습니다. ㅎㅎ 문제 보고 fsb 공부하려고 dreamhack가서 강의 처음부터 쭉 듣다가 st4nw한테 문제 받아서 풀려고했는데 그거보다 이게 쉬운문제같아서 바로 풀었습니다. 이제 다시 그문제 풀러 가야겠네요..ㅎㅎ 잡담이 길었고 다시 본론으로 들어가면 fsb문제인데, fsb를 발생시켜보면 6번째에서 주소값을 출력하는 것을 볼 수 있습니다. 그리고 코드..
2020.08.06 -
HACKCTF - Basic_FSB
문제 제목을 보면 FSB인것을 알 수 있으니 먼저 좁혀두고 가면 편할것이다. 실행하면 평범하게 입력값을 출력해준다. IDA로 실행해보면 전형적인 FSB문제 형식의 코드로 보인다 %p를 활용해서 주소를 출력해보면 첫번째 인자는 건너뛰고 2번째부터 시작되는것을 볼 수 있다. 또한 flag함수를 보면 /bin/sh 가 있으니 궁극적으로 이곳으로 리턴을 보내면 해결될 것이라는 것도 확인할 수 있다. 따라서 우리는 vuln함수의 printf(&format); 이 부분에서 printf.got 을 리턴으로 덮어주면 되니까 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 from pwn import * r = remote("ctf.j0n9hyun.xyz", 3002) context.log_level =..
2020.07.08