Let’s also talk about the slider verification code

The unit conducts offensive and defensive exercises, and I act as the attacker to try to crack it. It is found that the slider verification code has been upgraded, which is much more complicated than before. Fortunately, it is still one-dimensional verification without too much trouble.

The json object is read from the https interface. First, take out the base64 encoding of the image from the object, and then convert the string back into numpy.ndarray. Here I have converted two kinds of color images and grayscale images. The grayscale image is used to identify the gap in the next step; the color image is used to verify whether it is correct after finding the gap. When the attack is officially started, the color map will no longer be changed.

"params": {
    "Image": "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",
    "height": "109"
}
def str2Image_COLOR(src):
    data = src.split('base64,')[-1]
    img_byte = base64.b64decode(data)
    
    nparr = np.frombuffer(img_byte, dtype=np.uint8)
    npimage = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    
    return npimage

def str2Image_GRAYSCALE(src):
    data = src.split('base64,')[-1]
    img_byte = base64.b64decode(data)
    
    nparr = np.frombuffer(img_byte, dtype=np.uint8)
    npimage = cv2.imdecode(nparr, cv2.IMREAD_GRAYSCALE)
    
    return npimage

Since the current slider verification code is one-dimensional, that is to say, the Y value of the gap in the picture is fixed, and this value is directly returned in the http interface. So I cropped the valid part of the picture based on the Y value. code show as below:

def cutImage(image, height):
    cutImage = image[height:height + 70, 0:500]
    return cutImage

I used edge detection to identify the position of the gap in the image. In order to improve the clarity of the image after converting it to a binary image, I first increased the contrast of the image. code show as below:

def AddContrast(image):
    _image = np.zeros_like(image)
    h, w = _image.shape[:2]
    for _i in range(h):
        for _j in range(w):
            # blurred[i][j] = -0.5 * image[i][j] + 255 # 暗区域变亮,亮区域变暗
            _image[_i][_j] = min(255, max(2 * image[_i][_j], 0))  # 对比度增强
            # _SmallImage[i][j] = min(255, max((SmallImage[i][j] - 109), 0))  # 颜色发黑
    return _image

After the contrast is increased, it feels that some blurred pictures become much clearer. Then you can do edge detection of narrow borders. code show as below:

def setCanny(image):
    image = cv2.Canny(image, 50, 100)
    return image

After obtaining the edge binary image, find the location of the gap through the rectangular feature. Through observation, it is found that due to the interference of the background, the rectangular edge line of the image gap will be distorted and deformed, so that the line segments are distributed in the front and back columns or in the upper and lower rows, and the two rows are complementary. As shown below:

My opinion is:

  1. Traverse the picture column by column, the column to be traversed is x column;

  1. Determine whether the dot color values ​​on column x and column x+1 are consistent. If they are inconsistent, it means that column x and column x+1 are complementary after the line segment is distorted, and the current column counter is incremented by one; otherwise, it is not accumulated;

  1. Since the width of the image gap is fixed at 66 pixels, it is judged whether the color values ​​of the points on the x+65 column and the x+66 column are consistent. If they are inconsistent, it means that the x+65 and x+66 columns are complementary after the line segment is distorted, and the current column counter Accumulate one; otherwise do not accumulate;

  1. Obtain the color values ​​from x to x+66 in the two rows of y=2 and y=3. If the color values ​​of the points on the y2 and y3 rows are consistent, if they are inconsistent, the counter in the current column will be incremented by one; otherwise, it will not be accumulated;

  1. Since the height of the image gap is fixed at 66 pixels, judge the two lines of y=67 and y=68, and the color value from x to x+66. If they are inconsistent, the counter of the current column will be incremented by one; otherwise, it will not be accumulated;

  1. Sort the counters of all x columns, and the one with the largest number is considered to be the x value on the left side of the gap;

def getMostX(image):
    X = 0
    MaxNum = 0
    H, W = image.shape[:2]
    for w in range(W - 66):
        Num = 0
        for h in range(H):
            C1 = image[h, w]
            _C1 = image[h, w + 1]
            C2 = image[h, w + 65]
            _C2 = image[h, w + 66]
            if C1 != _C1:
                Num += 1
            if C2 != _C2:
                Num += 1
        for _w in range(65):
            C3 = image[2, w + _w]
            _C3 = image[3, w + _w]
            C4 = image[67, w + _w]
            _C4 = image[68, w + _w]  
            if C3 != _C3:
                Num += 1
            if C4 != _C4:
                Num += 1
        if Num > MaxNum:
            MaxNum = Num
            X = w
    return X

In order to verify the recognition result of the gap, draw a red rectangle according to the calculated x position on the left side of the gap in the color picture saved earlier for inspection. code show as below:

def checkImage(imageC, X, height):
    imageC = cv2.rectangle(imageC, (X, height), (X + 65, height + 65), (0, 0, 255), 2)
    return imageC

经过验证,识别准确率达到98%。但是这个方式仅仅能够适用于本次攻防演习,遇到其他滑块验证码还需要根据实际情况灵活调整。

Guess you like

Origin blog.csdn.net/ziele_008/article/details/128677629