전체 글 썸네일형 리스트형 [Java] 계산기 프로그램 대학교 과제로 Java를 이용해 간단한 사칙연산을 계산하는 프로그램을 개발했습니다. Infix(중위표기법)로 수식을 입력받아 Postfix(후위표기법)로 변환 후, 계산 결과를 출력하는 프로그램입니다. import java.util.EmptyStackException; import java.util.Scanner; public class MyCalculator { MyStack mySt; String[] postfix; boolean isError; public MyCalculator(int arrLen){ mySt = new MyStack(); postfix = new String[arrLen]; isError = false; } public int getPriority(String ch){ //연산자.. 더보기 [Reversing.kr] ImagePrc [주의] 해당 글에는 풀이 및 정답이 적혀있습니다. 스스로 해결하고 싶으신 분들은 문제를 해결한 후, 이 페이지를 참고하셨으면 합니다 : ) 프로그램을 실행해보면 무언가를 그릴 수 있는 화면과 Check 버튼이 나온다. Check 버튼을 눌러보면 Wrong 메시지 박스가 호출된다. 디버깅해보도록 하자. 일단 Wrong 문자열이 출력되는 메시지박스 구문부터 찾았다. 근데, 특이한 점은 틀렸다고 알려주는 부분은 있는데 정답일 때 맞았다고 해주는 부분을 찾지 못했다. 계속 분석해보면 GetDIBits 함수를 호출한다. 검색해보니 지정된 호환 비트맵에서 비트열을 뽑아내서 지정된 포맷을 사용하는 DIB로 버퍼에 복사한다고 한다. 아마 그린 이미지를 비트맵으로 읽어서 비트열을 뽑아내서 메모리 어딘가에 저장하는 것 .. 더보기 [Reversing.kr] Replace [주의] 해당 글에는 풀이 및 정답이 적혀있습니다. 스스로 해결하고 싶으신 분들은 문제를 해결한 후, 이 페이지를 참고하셨으면 합니다 : ) 프로그램을 실행해보면 숫자만 입력할 수 있는 박스와 Check라는 버튼이 있습니다. 내부 루틴을 통해 맞는 숫자인지 검사하는 프로그램 같아 보입니다. "Replace" 프로그램을 분석해보기 위해 디버거에 올리면 다음과 같이 바로 EP를 확인할 수 있습니다. 하나씩 실행하며 분석해보면 "CALL 0x401000" 명령이 있는데 따라가면 DialogBoxParamA 함수를 호출하는 것 같습니다. 그 아래에도 여러 코드가 있는데 살펴보니 GetDlgItemInt, SetDlgItemTextA 함수가 존재하고 SetDlgItemTextA 함수에서는 "Wrong" 인 문자열.. 더보기 [Reversing.kr] Easy Unpack [주의] 해당 글에는 풀이 및 정답이 적혀있습니다. 스스로 해결하고 싶으신 분들은 문제를 해결한 후, 이 페이지를 참고하셨으면 합니다 : ) Easy_UnpackMe.exe 파일과 함께 준 ReadMe.txt를 읽어보면, OEP를 찾으라고 합니다. 디버거로 열면 Entry Point를 찾을 수 없다는 경고 메세지를 띄어줍니다. 일반적인 프로그램의 모양새는 아닌 거 같습니다. 문제 이름에서 유추할 수 있듯이 패킹된 프로그램 같습니다. 문제 자체만 해결하면 크게 어렵지 않지만, 조금의 분석을 하면서 프로그램을 디버깅해봅시다. 첫 번째 반복문입니다. DS:[ECX]와 10,20,30,40,50을 XOR 연산하고 ECX를 1 증가시키고 ECX와 EDX를 비교해서 같을 때까지 반복하고 같다면 0x0040A0C3으.. 더보기 대학교 채용공지 크롤링 서비스 개발 평소에 취업에 걱정이 많아 잡코리아, 사람인과 같은 취업 지원 서비스들도 찾아보지만, 대학교 학과 홈페이지에 정보들도 많이 찾아본다. 처음에는 재학중인 학교의 학과 게시판만 확인했었는데, 나중에 일하고 싶은 분야와 관련된 채용 정보는 많이 안올라오고 정보의 한계가 있어서 자연스레 다른 학교 게시판도 확인하게 되었다. 이를 한 번에 확인하고 싶어서 간단하게 몇 개의 대학교 취업 정보 게시판의 정보를 크롤링해서 정리하는 페이지를 만들기로 했다. 개발은 기본적으로 Python을 이용하여, 크롤링은 BeautifulSouop 모듈을 이용했고 웹은 Flask로 서버를 돌렸다. 데이터를 파싱할 대학교 홈페이지는 다음과 같이 했다. 숭실대학교 컴퓨터학부 (cse.ssu.ac.kr) 서울대학교 컴퓨터공학부 (cse.s.. 더보기 [Dice CTF 2021] flippidy Binary 분석 Canary, NX가 설정되어있고, Full RELRO가 되어있다. Full RELRO이므로, GOT 영역을 쓸 수 없다. 다른 글들을 참고해보면 여러 방법이 있지만 __malloc_hook이나 __free_hook의 주소를 덮어서 공격을 했다. 프로그램을 실행하면, notebook의 크기를 입력받고 2가지의 기능을 선택할 수 있다. "add notebook", "flip notebook"이다. IDA로 각 기능을 분석하겠다. main 함수에서 notebook의 크기(=note_size)를 입력받았고, 해당 크기에 맞게 malloc( ) 함수를 통해 heap_addr를 저장한다. v1에 heap_addr + 8 * idx 값을 저장하고, 해당 주소에 0x30 만큼 동적 할당한다. 생성된.. 더보기 [linux] 라이브러리 관련 설정 요즘 포너블 문제를 풀어보고 있는데, 라이브러리가 제공되는 경우가 있다. 문제가 함수 주소를 계산해서 쉘의 획득을 요구하는 문제였다면 라이브러리의 버전이 상관없다. 하지만 heap과 관련된 문제라면 버전의 따라 패치가 된 취약점들이 존재하기 때문에 문제를 못 풀어보는 경우가 생긴다. (물론, 가능하다면 전에 포스팅한 것과 같이 문제를 해결한 경우도 있다. / HITCON Training Lab 12). 이 글에서는 내가 삽질해서 해결한 방법을 올린다. 원래 내 서버환경은 Ubuntu 20.04 버전으로 문제를 풀고 있었다. 그러던 중, 라이브러리를 바꿔서 바이너리를 실행하고 싶어서 방법을 찾아봤다. 처음엔 해당 링크에 있는 방법으로 해봤다. 하지만 에러 메세지가 출력되면서 모든 실행파일이 먹통이 되었다... 더보기 [Dice CTF 2021] babyrop 0. Binary 분석 64bit 바이너리에 NX bit가 설정되어 있고, 그 외의 보안 기법은 설정되어 있지 않다. write( ) 함수로 "Your name: "을 출력하고, gets( ) 함수로 변수를 입력받고 프로그램이 종료되는 간단한 함수다. 1. 취약점 분석 gets( ) 함수에서, 변수에 길이제한 없이 입력받기 때문에 "버퍼 오버플로우" 취약점이 발생한다. 80글자의 문자열을 입력하면 RIP를 덮어서 흐름을 제어할 수 있다. 2. Exploit 작성 문제 이름처럼, ROP를 이용하면 될 것 같다. 취약점 자체는 쉬웠지만, 익스플로잇을 작성하는데 어려움을 겪었다. 일단 쉘을 획득하기 위해 write( ) 함수를 이용하여, write나 gets의 주소를 leak해서 system( )이나 exec.. 더보기 이전 1 2 3 4 5 6 ··· 9 다음