https://www.acmicpc.net/problem/9012

 

9012번: 괄호

문제 괄호 문자열(Parenthesis String, PS)은 두 개의 괄호 기호인 ‘(’ 와 ‘)’ 만으로 구성되어 있는 문자열이다. 그 중에서 괄호의 모양이 바르게 구성된 문자열을 올바른 괄호 문자열(Valid PS, VPS)이라고 부른다. 한 쌍의 괄호 기호로 된 “( )” 문자열은 기본 VPS 이라고 부른다. 만일 x 가 VPS 라면 이것을 하나의 괄호에 넣은 새로운 문자열 “(x)”도 VPS 가 된다. 그리고 두 VPS x 와 y를 접합(conc

www.acmicpc.net

 

9012번 괄호는 괄호의 짝을 찾는 문제입니다.

문제를 읽어보시면 여는괄호가 있을때 닫는 괄호가 있다면 짝이 맞는것입니다.

 

문제를 접근할때는 여는 괄호가 나올 때 마치 스택에 넣듯이 생각하시면 됩니다.

위 그림과 같이 여는 괄호가 나올때 스택에 넣고 닫는 괄호가 나올때마다 하나씩 뺀다고 생각 하시면 됩니다.

그렇게 되면 Stack_size가 여는 괄호가 나올때는 1씩 증가하고, 닫는 괄호가 나올때 1씩 감소하게 됩니다.

그러므로 Stack_size가 0이면 모든 괄호가 짝이 있어서 "YES"를 출력하면 됩니다.

하지만 0이 아니거나 Stack_size가 한번이라도 음수가 된다면 짝이 없는 것이므로 "NO"를 출력하면 되겠습니다.

 

 

'Programming > Baekjoon' 카테고리의 다른 글

BOJ ) 10866번 덱  (0) 2019.06.25
BOJ ) 1158번 조세퍼스문제  (0) 2019.05.31
BOJ ) 10845_큐  (0) 2019.05.30
BOJ ) 1406 에디터  (0) 2019.05.25
BOJ ) 10799번 쇠막대기  (0) 2019.05.23

https://www.acmicpc.net/problem/10799

 

10799번: 쇠막대기

여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저의 배치는 다음 조건을 만족한다. 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓는다. 각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다. 레이저는 어떤 쇠막대기의 양 끝점과

www.acmicpc.net

문제를 읽어보면  '(' 다음에 바로 ')' 이렇게 나오면 레이저가 됩니다 ==>()

그렇지 않고 그냥 '(' 만 있다면 파이프의 시작 부분이 되는것입니다. 

그리고 ')'는 파이프가 끝나는 부분이 됩니다. 

 

그러므로 파이프가 생성될 때 pipe_counter를 1씩 증가시켜주고 레이저가 나온다면 우선 pipe_count만큼 잘리게 됩니다.

파이프가 끝나게 되면 정답에 +1을 해주어 총 파이프 한개가 레이저에 의해 잘린 횟수가 정답에 더해지게 됩니다.

 

 

 

 

 

 

'Programming > Baekjoon' 카테고리의 다른 글

BOJ ) 10866번 덱  (0) 2019.06.25
BOJ ) 1158번 조세퍼스문제  (0) 2019.05.31
BOJ ) 10845_큐  (0) 2019.05.30
BOJ ) 1406 에디터  (0) 2019.05.25
BOJ ) 9012번 괄호  (0) 2019.05.23

IP = Internet Protocol  --> OSI 모델 3계층(네트워크 계층)에서 동작한다.

  *IPv4

  *IPv6

TCP = Transmission Control Protocol

UDP = User Datagram Protocol


Advance 09번 문제입니다.

디버거로 열어 시작해보겠습니다.

이렇게 관련된 문자열이 있는 부분으로 가보겠습니다. 우선 UserName 을 입력받는 함수가 있었습니다.

이렇게 아무렇게 입력하고,

password를 받는 함수에서도 이렇게 입력해줍니다.

그다음에 나오는 함수가있는데 여기로 들어가보겠습니다.

여기보면 저기 제가 입력한 username도 있습니다. 여기를 하나하나 살펴보면

중간에 이렇게 제가입력한 password를 비교하는 문자열이 나옵니다. EAX값은 제가입력한 비밀번호의 16진수 값이고 그걸 비교하는 다른 값은 10진수로 바꿔주게되면 PASSWORD가 되겠습니다.

이름은 다음을 통해 알수있습니다. 저기 루프문을 보면 ABCD와 DonaldDuck을 비교하는 루프문임을 알 수 있습니다. 이를 조합해보면

정답을 맞추게 됩니다. 위를 다 해도 원래 2번째 Welcome...은 나오지않습니다. 이는 성공했다는 문자열로 가는 문턱에 점프문이 있어 여기를 계속 띄어넘어버리기 때문입니다. 그부분을 찾아 NOP으로 바꿔주시면 위와같이 나오게 됩니다.

'Reversing > CodeEngn Advance' 카테고리의 다른 글

CodeEngn Advance 08 (미해결)  (0) 2015.08.26
CodeEngn Advance 06  (0) 2015.08.23
CodeEngn Advance 05  (0) 2015.08.20
CodeEngn Advance 04  (0) 2015.08.20
CodeEngn Advance 03  (0) 2015.08.15


Advance 08번 문제입니다.

우선 디버거를 통해서 프로그램에서 입력했을 때 나온 문자열을 찾아 이동하였습니다.

CMP EAX,3이라고 되어있는 부분을 CMP EAX,2라고 바꾸어주었습니다. 그리고 실행시켜보면

이렇게 입력하고 CHECK IT을 눌러보겠습니다.

그리고 많은 CALL 명령어 중에 맨밑에는 시리얼 번호를 판별하는 함수이고 그 위에함수가 NAME을 판별하는 함수여서 저부분에 먼저 들어가보겠습니다.

정말 길게 늘어진 코드들을 보며 하나하나씩 이해하려고 노력했습니다...

이렇게 루프문도 하나 찾았습니다. 총 두번 왕복하는 루프문인데 아마 문자가 2자리라서 그런것 같습니다. 이부분은 첫번째 문자를 찾아내는 루프문이고


두번째 루프문도 찾아내었습니다. 첫번째와 비슷한 형식인데 역시 2번 왕복합니다. 두번째 문자를 찾아내는 루프문인것 같습니다.

세번째도있고

4번째도 있지만 그냥 단순히 계산을 해주는 모양인것 같습니다. 

이런 루프문을통해서 BRUTE FORCE기법을 사용하기위해  코딩을 해줘야하는데 아직 저에게 코딩실력이 갖추어지지 않아서 문제를 풀지 못하고있습니다. 어느정도 배우고나면 다시 문제를 손봐야겠군요 ㅠㅠ

'Reversing > CodeEngn Advance' 카테고리의 다른 글

CodeEngn Advance 09  (0) 2015.08.27
CodeEngn Advance 06  (0) 2015.08.23
CodeEngn Advance 05  (0) 2015.08.20
CodeEngn Advance 04  (0) 2015.08.20
CodeEngn Advance 03  (0) 2015.08.15



아ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ정말 힘들었습니다. 6번;

일단 패킹이되어있습니다.

뚫어주시면 됩니다.

이제 본격적으로 시작해봅니다.

일단 안티디버그 함수가 발견되었습니다.

없애주면 됩니다.

일단 메세지 창이 떳기때문에 이함수를 위주로 보면될것같습니다.

맨위에 messageboxa는 안티디버그 함수가 디버깅을 감지했을때 나오는 경고창이고 다른함수를 탐색해봤습니다. messageboxw함수를 말이죠

그랬더니 스택창에 이렇게되어있는 함수하나를 찾았습니다.

여기서 저는 몇일간 삽질을 했습니다.막 CALL이란 CALL부분은 전부 F7해서 들어가본것같습니다. 그렇게 하다가 드디어 오늘 이시각에 찾아내었습니다. 

정말 그럴싸한 부분아니겠습니까?!!!?!?!?!?

제가 마지막에 메세지에 띄운 창에 5가 적혀있었는데 바로 이 5와 어떤 숫자를 비교하는것을 발견했습니다!!!!!!!!!!!!!!!!!!

정답은 나온것같습니다 MD5해쉬값으로 변환하면 답이되겠군요

'Reversing > CodeEngn Advance' 카테고리의 다른 글

CodeEngn Advance 09  (0) 2015.08.27
CodeEngn Advance 08 (미해결)  (0) 2015.08.26
CodeEngn Advance 05  (0) 2015.08.20
CodeEngn Advance 04  (0) 2015.08.20
CodeEngn Advance 03  (0) 2015.08.15


strcomp 함수입니다. 이 함수는 문자열 비교 함수인데 

vbaStrCmp 함수 등과 똑같은 역할을 하는 함수입니다. 

string1 과 string2가 있는데

string1이 string2보다 우선 정렬 된다면 -1을 반환하는것 같고

string1=string2이면 0을 반환하고

string1이string2보다 나중 정렬 된다면 1을 반환하는것 같습니다. 


잘못된점이나 피드백을 주실 분 계시면 댓글 달아주시면 감사하겠습니다.

'Reversing > Function' 카테고리의 다른 글

Istrcmp  (0) 2015.08.08
timeGetTIME  (0) 2015.08.08


Advance 05번 문제입니다.

프로그램을 실행시켜보겠습니다.

임의로 값을 넣어보니 위와같은 메세지가 나옵니다.

디버거를 통해 열어보았습니다.

텍스트를 찾으니 별다른 것이 나오지않아서 함수를 찾아보았습니다. 그랬더니 vbaStrCmp함수가 있어서 이부분으로 가보았습니다.

BP를 걸고 실행시켜보니 프로그램이 실행되어서 값을넣고 OK를 눌렀습니다.

그리고 함수 안으로 들어오니 위와같이 되어있었습니다. ESP+8번지에 값을 넣고 함수를 호출한 후 리턴하는 형식입니다.

내리다보니 제가넣은 값과 어떠한 다른값이 보였습니다. 다시보니 첫번째 PUSH에는 제가 넣은 값이 들어갔고 2번째 PUSH에는 어떤 다른 값이 들어갔습니다.

EAX에는 제가 넣은값, ECX에는 함수에서 비교가 되는 값이 들어있었습니다.

그대로 넣어보니 정답이었습니다.

'Reversing > CodeEngn Advance' 카테고리의 다른 글

CodeEngn Advance 08 (미해결)  (0) 2015.08.26
CodeEngn Advance 06  (0) 2015.08.23
CodeEngn Advance 04  (0) 2015.08.20
CodeEngn Advance 03  (0) 2015.08.15
CodeEngn Advance 02  (0) 2015.08.15

+ Recent posts