전체 글 292

[백준 BOJ] 1152 단어의 개수

1152_단어의 개수 링크 https://www.acmicpc.net/problem/1152 풀이 이 문제는 생각보다 정답 비율이 낮습니다. 단어는 공백으로 구분할 수 있고 공백이 연속해서 나오는 경우는 없다고 했기 때문에, 공백의 개수 + 1이 단어의 개수라는 것을 알 수 있습니다. 하지만 맨 앞에 공백이 오거나 맨 뒤에 공백으로 끝나는 경우가 있을 수도 있으니 그 부분에 대한 코드도 짜줘야 할 것 같습니다. 코드

PS/BOJ 2018.05.16

[백준 BOJ] 14584 암호 해독

14584_암호 해독 링크 https://www.acmicpc.net/problem/14584 풀이 1) 문자열을 1씩 올리면서 문자열에 주어진 단어들이 있는지 탐색합니다. 2) 있으면 문자열을 출력하고 종료. 문자열 탐색 방법 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 //14584_암호 해독 #include #include using namespace std; int main() { int n, i, j; string str; //암호 문자열 string word[20]; //단어 cin >> str; cin >> n; for (i = 0; i > word[i]; } for (i = 0; i

PS/BOJ 2018.05.13

[백준 BOJ] 10250 ACM 호텔

10250_ACM 호텔 링크 https://www.acmicpc.net/problem/10250 풀이 일단 이렇게 사람들이 배정을 받는다는 사실은 눈치 챘을 것입니다. 단순하게 예제만 본다면 402의 4는 10%6이고 뒤에 2는 10/6+1이고, 1203의 12는 72%30이고, 3은 72/30+1이라고 생각할 수 있습니다. 이렇게 생각했을 때 일반화 한다면, h, w, n을 받았을 때, n%h과 n/h+1을 출력하면 될 것 같습니다. 하지만 이 문제에서 주의할 게 2가지 있습니다. 1) 꼭대기 층일 때 (n%h가 0일 때) 이때는 값이 다르게 됩니다. 2) 출력할 때, YXX, YYXX로 출력해야 하는데 X가 한 자리이면 앞에 0을 붙여야한다. ex) 1층 1호 -> 11(X) 101(O) 이것만 주의..

PS/BOJ 2018.05.13

[Codegate 2018] catshop

[Codegate 2018] catshop 32bit 바이너리이고, Canary와 NX가 걸려있습니다. main 함수의 코드는 이렇습니다. 숫자를 입력 받을 때, scanf %d, 혹은 read로 입력 받은 후 atoi로 변환하는 것이 아니라, 그냥 read로만 읽기 때문에 python을 이용해서 입력을 줘야합니다. 처음에 1과 2 메뉴로 8byte fastbin을 할당하고 해제할 수 있습니다. 1번 메뉴에서 할당한 주소에 mew~! mew~!를 print 해주는 함수 포인터를 저장하죠. 그리고 3번 메뉴에서 그 함수 포인터를 이용해서 함수를 호출하게 됩니다. 4번 메뉴에서는 이름을 바꿀 수 있는 함수가 있습니다. 여기서도 read로 읽어와서 malloc으로 할당해주고, 거기에 원하는 내용을 fgets ..

System&Write up/CTF 2018.04.08

[Codegate 2018] DaysNote

[Codegate 2018] DaysNote 바이너리는 32bit이고 보호 기법은 걸려있지 않습니다. 실서버 ASLR 또한 꺼져 있습니다. 연도와 내용을 입력 받습니다. 그리고 CountDays 함수를 통해서 그 연도의 일수를 return 하게 합니다. 여기서 윤년이 아니면 365일, 윤년이면 366일을 반환하게 됩니다. 그 후 일수만큼 입력 받았던 내용을 dest에 복사하게 되는데, 여기서 0x16D는 365기 때문에 윤년일 경우 1byte overflow가 일어납니다. 즉, FPO가 가능할 것 같네요. 쉘코드를 내용에 박고 SFP를 쉘코드가 박힌 주소를 가리키는 주소의 -4로 변조해주면 됩니다. 그리고 저 배열의 시작 주소를 가리키는 곳이 있으니 저 부분 -4로 SFP를 변조하면 될 것 같습니다. 1..

System&Write up/CTF 2018.04.08

[Codegate 2018] betting

[Codegate 2018] betting 64bit 바이너리이고, canary와 NX가 걸려있습니다. 그리고 바이너리에 기분 좋게 helper라는 쉘을 띄워주는 함수가 있습니다. 보시면 s는 bp-0x20에 있고 입력은 s에 0x28만큼 받습니다. v24가 canary이고 밑에 printf로 s를 출력해 주기 때문에 중간에 있는 NULL byte를 제거해주면 canary를 leak 할 수 있습니다. canary는 bp-0x8이니 s와의 거리는 0x18이(24)겠죠. 마지막 byte는 NULL일 것이니 s에 “A”*24를 sendline으로 넘겨주면 “A”*24+”\x0a”가 전달되면서 NULL byte가 덮일 것입니다. 1 2 3 4 payload = "A"*40 + p64(canary) + "A"*8..

System&Write up/CTF 2018.04.06

CODEGATE 2018 본선, 컨퍼런스 후기

2018.4.4(수) 코드게이트 본선이 열렸습니다. 국제 대회이고 큰 대회여서 기대도 되고 떨리기도 많이 떨렸습니다.(하아 한국 임재민ㅜㅜ) 그리고 코드게이트 후드집업도 받았습니다! 본선은 11시간? 동안 진행되었는데, 완전 집중해서 시간이 엄청 빨리 갔습니다. 사진은 없지만 총 4문제를 풀었습니다.(hi, betting, catshop, DaysNote) 내년에는 더 열심히 해서 좋은 성적을 얻고 싶습니다ㅎ 다음날 이런 인증서도 받았고, 시상식에서 단체 사진도 찍었습니다.(상 받으신 분들 너무 멋있으셔..) 그리고 유익한 발표 세미나도 들었습니다~ 그리고.. 네트워크 파티 가서 PPP와 사진도 찍었습니다ㅠㅠㅠㅠ박세준님과 악수도 했습니다ㅜㅜㅜ 더 열심히 공부해야겠다ㅜㅜ 본선 라업들은 곧 써서 올리겠습니다~!

[pwnable.kr] Rookiss - echo1

[pwnable.kr] Rookiss – echo1 64bit 바이너리이고, 보호기법들이 모두 꺼져있는 걸 볼 수 있습니다. 실행을 하면 이름을 입력 받고, 메뉴를 출력합니다. 1번 BOF echo만 사용할 수 있습니다. 1번 menu인 echo1 함수입니다. s가 bp-0x20인데, 128byte나 입력 받기 때문에 BOF 취약점이 발생합니다. canary가 없어서 바로 return address를 덮을 수 있습니다. NX가 안 걸려있어서 shell code를 이용할 수 있습니다. ASLR 때문에 고정된 주소가 필요합니다. main의 일부분입니다. 이름을 입력 받고 4byte가 id라는 변수에 들어갑니다. 그리고 id는 bss 영역에 있죠. id에 jmp rsp를 넣고 return address를 id..

반응형